diff --git a/.gitbook.yaml b/.gitbook.yaml index 865ad5463..ee37b0bad 100644 --- a/.gitbook.yaml +++ b/.gitbook.yaml @@ -1,5 +1,5 @@ root : ./ structure: - readme: book/introduction.md - summary: book/toc.md + readme: book/en/introduction.md + summary: book/en/toc.md diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index cb7753883..973e03c7f 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -8,7 +8,11 @@ # the repo. Unless a later match takes precedence, # @global-owner1 and @global-owner2 will be requested for # review when someone opens a pull request. -* @lenucksi @NewMexicoKid @cewilliams @spier +* @lenucksi @NewMexicoKid @cewilliams @spier @robtuley + +# Trying out folder-specific CODEOWNERS permissions, by example of our Japanese book +/translation/ @yuhattor +/book/ @yuhattor # Order is important; the last matching pattern takes the most # precedence. When someone opens a pull request that only diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..31b823e78 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: true +contact_links: + - name: Slack + url: https://innersourcecommons-inviter.herokuapp.com + about: Join our Community on Slack for help and a casual chat. + - name: Patterns Book + url: https://patterns.innersourcecommons.org + about: Read our most mature patterns here. diff --git a/.github/ISSUE_TEMPLATE/pattern-draft.md b/.github/ISSUE_TEMPLATE/pattern-draft.md new file mode 100644 index 000000000..502501ef9 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/pattern-draft.md @@ -0,0 +1,70 @@ +--- +name: Pattern Draft +about: Suggest a new Pattern +title: "[Pattern Draft]" +labels: 1-initial, Type - Content Work +assignees: '' + +--- + +This is the most basic template for a new pattern. +See our full pattern syntax [here](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/meta/pattern-template.md). + +## Title + +Short Title Here + +## Patlet / Summary + +Concise 1-2 sentence description of the problem and solution. + +## Problem + +What is the problem - crisp definition of the problem. +Short description, usually not more than a couple sentences, that describes what the issues and challenges are. +Be careful not to morph into information found in other sections below. + +## Context + +Where does the problem exist? +What are the pre-conditions? +**Unchangeable** before the solution goes into place. +The content here is often tied to the applicability of the pattern for other readers: "Do I have this same particular situation?" + +## Forces + +What makes the problem difficult? +What are the trade-offs? +These are constraints that **can be changed** at a cost. +The solution might change one or more of these forces in order to solve the problem, while also in-turn changing the context. + +## Solutions + +Verified resolutions and possible resolutions to the problem. + +## Resulting Context + +What is the situation after the problem has been solved? +The original context is changed indirectly by way of the solution. +Often this section can include discussion of the next possible Patterns/problems introduced. +This section can be short in content - the solution may not introduce new problems or change much context. + +## Known Instances (optional) + +Where has this been seen before? +Helps to reinforce that this is a REAL pattern and that you match the context. + +May mention: + +* A particular business +* Anonymized instances ex: "3 companies have proven that this is a good solution" or "A large financial services org...". + +## Status + +Initial + +## Author(s) (optional) + +Often, this is yourself. +If you need to, find someone in the InnerSource Commons to be the nominal author (As Told To). +Could also be no-one if you do not want to take on authorship (common with a donut looking for a solution). diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml index 5af618ba5..98870b2cb 100644 --- a/.github/workflows/book.yml +++ b/.github/workflows/book.yml @@ -1,36 +1,42 @@ -name: Book ToC Generation +name: Gitbook Generation on: push: branches: - "main" - - "book-staging" + - "book-*" jobs: - book-toc-generation: + gitbook-generation: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 with: ref: ${{ github.head_ref }} - - uses: actions/setup-ruby@v1 + - uses: ruby/setup-ruby@v1 with: ruby-version: '2.6' + working-directory: 'book/scripts/' + bundler-cache: true - - name: Install ruby dependencies + - name: Determine book language run: | - cd book/ - gem install bundler - bundle install + [[ "$GITHUB_REF_NAME" =~ ^book-ja.*$ ]] && book_language="ja" || book_language="en" + echo "BOOK_LANGUAGE=$book_language" >> $GITHUB_ENV - name: Generate ToC run: | - cd book/ - ruby generate_toc.rb + cd book/scripts/ + ruby generate_toc.rb $BOOK_LANGUAGE + echo "Generated book for: $BOOK_LANGUAGE" >> $GITHUB_STEP_SUMMARY - - name: Commit new ToC to book/toc.md + - name: Copy .gitbook.yml to root + run: | + cp book/$BOOK_LANGUAGE/.gitbook.yaml . + + - name: Commit updated files for the book uses: stefanzweifel/git-auto-commit-action@v4 with: - commit_message: Writing new ToC for the book + commit_message: Writing updated files for the book diff --git a/.github/workflows/generate-mindmap.yml b/.github/workflows/generate-mindmap.yml index accbbd6ee..9da560145 100644 --- a/.github/workflows/generate-mindmap.yml +++ b/.github/workflows/generate-mindmap.yml @@ -8,6 +8,7 @@ on: paths: - ".github/workflows/generate-mindmap.yml" - "pattern-categorization/innersource-program-mind-map.md" + - "pattern-categorization/package.json" defaults: run: @@ -17,11 +18,11 @@ jobs: generate-mindmap: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js - uses: actions/setup-node@v2 + uses: actions/setup-node@v3 with: - node-version: 12.x + node-version: 16 cache: 'npm' cache-dependency-path: pattern-categorization/package-lock.json - name: Install Node.js dependencies diff --git a/.github/workflows/link-checker-prs.yml b/.github/workflows/link-checker-prs.yml new file mode 100644 index 000000000..35511796d --- /dev/null +++ b/.github/workflows/link-checker-prs.yml @@ -0,0 +1,46 @@ +# This link check is run on all PRs but just for the files that were changed/added in the PR itself. +# Otherwise we had it too often that PR authors would see a failing link check that had nothing to do with their PR. + +name: Link Check PR + +on: + push: + branches: + - main + pull_request: + branches: + - main + +jobs: + linkChecker: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + + - name: Get changed files + id: changed-files + uses: tj-actions/changed-files@v32 + + - name: Filter markdown files only + run: | + md_files=`find ${{ steps.changed-files.outputs.all_changed_files }} -maxdepth 0 -name "*.md" | tr '\n' ' '` + echo "MARKDOWN_FILES=$md_files" >> $GITHUB_ENV + + - name: Restore lychee cache + uses: actions/cache@v3 + with: + path: .lycheecache + key: cache-lychee-${{ github.sha }} + restore-keys: cache-lychee- + + - if: ${{ env.MARKDOWN_FILES != '' }} + name: Link Checker + uses: lycheeverse/lychee-action@v1.5.2 + with: + args: --verbose --no-progress --exclude-mail --cache --max-cache-age 1d $MARKDOWN_FILES + fail: true + jobSummary: true + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/link-checker.yml b/.github/workflows/link-checker.yml index f82b2bb0e..65f8e1e06 100644 --- a/.github/workflows/link-checker.yml +++ b/.github/workflows/link-checker.yml @@ -1,26 +1,33 @@ -# from: https://github.com/marketplace/actions/link-checker -# link checker used is 'liche': https://github.com/raviqqe/liche +# This link check is run on all content files once per day. -name: Link Check on Patterns and README +# from: https://github.com/lycheeverse/lychee-action +# link checker used is 'lychee': https://github.com/lycheeverse/lychee + +name: Link Check on: - push: - branches: - - "main" - pull_request: schedule: # * is a special character in YAML so you have to quote this string - - cron: '30 8 * * *' + - cron: '30 8 * * 5' jobs: linkChecker: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 - - name: Link Checker - id: lc - uses: peter-evans/link-checker@v1 - with: - args: -v -d . -x "http://creativecommons.org/licenses|https://isc-inviter.herokuapp.com|https://github.com/rcs/rcs-viewer/pull/81|fearlesschangepatterns.com|https://ulir.ul.ie/bitstream/handle/10344/4443/Stol_2014_inner.pdf" README.md patterns/ -r - - name: Fail if there were link errors - run: exit ${{ steps.lc.outputs.exit_code }} + - uses: actions/checkout@v3 + + - name: Restore lychee cache + uses: actions/cache@v3 + with: + path: .lycheecache + key: cache-lychee-${{ github.sha }} + restore-keys: cache-lychee- + + - name: Link Checker + uses: lycheeverse/lychee-action@v1.5.2 + with: + args: --verbose --no-progress --exclude-mail --cache --max-cache-age 1d README.md patterns/ book/ translation/ + fail: true + jobSummary: true + env: + GITHUB_TOKEN: ${{secrets.GITHUB_TOKEN}} diff --git a/.github/workflows/lint-patterns.yml b/.github/workflows/lint-patterns.yml index a55402a2a..a2bb125ec 100644 --- a/.github/workflows/lint-patterns.yml +++ b/.github/workflows/lint-patterns.yml @@ -17,9 +17,9 @@ jobs: validate: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Problem Matcher for markdownlint-cli - uses: xt0rted/markdownlint-problem-matcher@v1 + uses: xt0rted/markdownlint-problem-matcher@v2 - name: Lint pattern files (markdown) uses: avto-dev/markdown-lint@v1 with: diff --git a/.github/workflows/markdownlint.yml b/.github/workflows/markdownlint.yml index 8e7a9afb7..4777fb45b 100644 --- a/.github/workflows/markdownlint.yml +++ b/.github/workflows/markdownlint.yml @@ -20,11 +20,11 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v3 - name: Use Node.js - uses: actions/setup-node@v1 + uses: actions/setup-node@v3 with: - node-version: 12.x + node-version: 16 - name: Run Markdownlint run: | echo "::add-matcher::.github/workflows/markdownlint-problem-matcher.json" diff --git a/.lycheeignore b/.lycheeignore new file mode 100644 index 000000000..33c6a3f7f --- /dev/null +++ b/.lycheeignore @@ -0,0 +1,11 @@ +# These links are ignored by our link checker https://github.com/lycheeverse/lychee +# The file allows you to list multiple regular expressions for exclusion (one pattern per line). +https://example.com/link/to/your/trusted/committer/documentation.md +https://github.com/rcs/rcs-viewer/pull/81 +http://creativecommons.org/licenses +https://isc-inviter.herokuapp.com +fearlesschangepatterns.com +https://ulir.ul.ie/bitstream/handle/10344/4443/Stol_2014_inner.pdf +.*@andrew.clegg.* +https://m.dotdev.co/how-to-write-a-readme-that-rocks-bc29f279611a +https://innersourcecommons-inviter.herokuapp.com diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 03fe18f0a..dd18e5c8c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -2,29 +2,34 @@ The goal of the InnerSource patterns working group is to collect, document, and publish InnerSource best practices. To make the best practices easy to comprehend, evaluate, and apply, we codify them in a specific structure - [the patterns format](meta/pattern-template.md). More infos on the working group can be found in our [README.md](README.md) file. -For this working group to strive, we welcome your contribution - be it small or huge. +For this working group to thrive, we welcome your contribution - be it small or huge. ## How to Contribute? -Please consider contributing in the following ways: +Please consider contributing to the InnerSource Patterns. +Here some suggestions on how you can contribute. -1. **Share your thoughts & spark discussion**. A fresh perspective, an interesting thought, or an early novel idea can spark discussions and yield unforeseeable results. We invite you to share your thoughts on InnerSource-related topics at any time by [creating an issue](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/new), [via Slack, or our patterns office hours](#how-to-get-in-touch). +1. **Share your thoughts & spark discussion**: A fresh perspective, an interesting thought, or an early novel idea can spark discussions and yield unforeseeable results. We invite you to share your thoughts on InnerSource-related topics at any time by [creating an issue](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/new) or [via Slack](#how-to-get-in-touch). -2. **Read & improve existing patterns.** If you want to get started, we encourage you to read through the existing patterns and materials in this repository. Found a misleading phrase or phony grammar? A mistake in the content? Let us know by [creating an issue](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/new) or directly propose your fix as a pull request. +2. **Read & improve existing patterns**: If you want to get started, we encourage you to read through the existing patterns and materials in this repository. Found a misleading phrase or phony grammar? A mistake in the content? Let us know by [creating an issue](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/new) or directly propose your fix as a pull request. -3. **Review open pull requests.** Even without knowing all the specifics of the patterns working group, your feedback on existing [pull requests](https://github.com/InnerSourceCommons/InnerSourcePatterns/labels/type%20-%20Content%20work) (especially those propising changes to pattern contents) will be valuable to its authors: As somebody who wants to learn more about InnerSource, you can give input from the perspective of a future reader. As somebody with own InnerSource experiences, you can share your experience with the authors. +3. **Confirm that you are using a pattern**: When multiple organisations confirm that they are using a pattern, that increases the relevance of the pattern as it lets other adopters known that this pattern is proven. If you are using one of our patterns, you can list your org as **Known Instance** on the given pattern, together with a description of the experiences that you made applying it. Here some examples of [great Known Instances descriptions](patterns/2-structured/document-your-guiding-principles.md#known-instances). -4. **Contribute a new pattern.** A key contribution you can make is to document an InnerSource best practice you experienced or know about. We defined different maturity levels for the contents in this repository: First time contributors should aim for maturity levels `1: initial` (for unstructured experience reports or what we call donuts - patterns with missing pieces) and `2: structured` (for best practices adhering to the patterns format and following basic writing style conventions). Our [Contributor Handbook](meta/contributor-handbook.md) discusses all this in more detail. You don't feel ready yet to contribute a new pattern? Please start a discussion by [creating an issue](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/new). +4. **Translate existing patterns**: When implementing InnerSource practices in your region, there can be language barriers for people as most of the InnerSource content is available in English. Therefore we see great value in getting people in your region/organization to understand InnerSource in their own language. To help us translate patterns to other languages please refer to [these translation instructions](translation/README.md). -5. **Be a patterns advocate.** The patterns will become better and cover more topics the more people contribute their perspective and experience. A colleague told you about a novel InnerSource best practice? Please invite her/him to contribute to this repository! +5. **Review open pull requests**: Even without knowing all the specifics of the patterns working group, your feedback on existing [pull requests](https://github.com/InnerSourceCommons/InnerSourcePatterns/labels/type%20-%20Content%20work) (especially those proposing changes to pattern contents) will be valuable to its authors: As somebody who wants to learn more about InnerSource, you can give input from the perspective of a future reader. As somebody with own InnerSource experiences, you can share your experience with the authors. + +6. **Contribute a new pattern**: A key contribution you can make is to document an InnerSource best practice you experienced or know about. We defined different maturity levels for the contents in this repository: First time contributors should aim for maturity levels `1: initial` (for unstructured experience reports or what we call donuts - patterns with missing pieces) and `2: structured` (for best practices adhering to the patterns format and following basic writing style conventions). Our [Contributor Handbook](meta/contributor-handbook.md) discusses all this in more detail. You don't feel ready yet to contribute a new pattern? Please start a discussion by [creating an issue](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/new). + +7. **Be a patterns advocate**: The patterns will become better and cover more topics the more people contribute their perspective and experience. A colleague told you about a novel InnerSource best practice? Please invite her/him to contribute to this repository! ## How to get in touch? -We are happy to support you in contributing to the InnerSource patterns or to just chat with you. You can reach out to us in the following ways: +We are happy to support you in contributing to the InnerSource patterns or to just chat with you. -1. **Via Slack.** Join the InnerSource Commons [Slack instance](https://isc-inviter.herokuapp.com/) and enter the `#innersource-patterns` channel there. +You can best reach out to us **via Slack**: -2. **During the patterns office hours.** We established a regular cadence of office hours for you to ask questions. Find the date of the next patterns office hours [in this calendar](https://innersourcecommons.org/patterns-officehours). +Join the InnerSource Commons [Slack instance](https://isc-inviter.herokuapp.com/) and enter the `#innersource-patterns` channel there. ## License of Contributions diff --git a/README.md b/README.md index 36c2d6359..fdbc48d73 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,11 @@ +[![Check Links](https://github.com/InnerSourceCommons/InnerSourcePatterns/actions/workflows/link-checker.yml/badge.svg)](https://github.com/InnerSourceCommons/InnerSourcePatterns/actions/workflows/link-checker.yml) +[![Pattern Syntax Validation](https://github.com/InnerSourceCommons/InnerSourcePatterns/actions/workflows/lint-patterns.yml/badge.svg)](https://github.com/InnerSourceCommons/InnerSourcePatterns/actions/workflows/lint-patterns.yml) +[![Join our Slack!](https://img.shields.io/static/v1?message=join%20chat&color=9cf&logo=slack&label=slack)](https://innersourcecommons-inviter.herokuapp.com) + # InnerSource Patterns - + This repository contains the InnerSource Patterns collected by the [InnerSource Commons][isc-website]. These patterns are InnerSource best practices codified in a specific format to make it easy to understand, evaluate, and reuse them. @@ -9,20 +13,20 @@ If you are here for the first time, you may start by reading our most mature pat Below you find [what a pattern is](#what-are-innersource-patterns), a [list of known patterns](#list-of-patterns), and [how to use these patterns](#how-can-you-use-innersource-patterns) in your organization. -You are already using InnerSource in your company and want to share your ideas and experiences with the world? We would love to [welcome your contributions](#how-to-contribute)! +Are you already using InnerSource in your company? If you would like to share your experiences with the world, we would love to [welcome your contributions](#how-to-contribute)! [isc-website]: http://innersourcecommons.org ## Mission Statement -Our mission in this working group +Our mission -- Collect and document agreed upon best practices of how to do InnerSource - in the form of patterns -- Continuously publish the most mature patterns as an ebook +- Collect and document best practices on how to do InnerSource - in the form of patterns +- Publish the most mature patterns as an ebook ## List of Patterns -The below lists all known patterns. They are grouped into three [maturity levels](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/master/meta/contributor-handbook.md#maturity-levels). + All known patterns (grouped into three [maturity levels](./meta/contributor-handbook.md#maturity-levels)) are as follows: ### Maturity Level 3: Validated @@ -37,7 +41,7 @@ The below lists all known patterns. They are grouped into three [maturity levels * [Gig Marketplace](patterns/2-structured/gig-marketplace.md) - *Establish a marketplace by creating an intranet website that lists specific InnerSource project needs as "Gigs" with explicit time and skill requirements. This will enable managers to better understand their employee’s time commitment and professional benefits thereby increasing the likelihood of garnering approval to make InnerSource contributions.* * [Maturity Model](patterns/2-structured/maturity-model.md) - *Teams have started adopting InnerSource. The practice is spreading to multiple departments. Understanding of what constitutes an InnerSource project are wide spread though. The solution is to provide a maturity model to allow for teams to go through a self check and discover patterns and practices that they are not yet aware of.* * [InnerSource License](patterns/2-structured/innersource-license.md) - *Two legal entities that belong to the same organization want to share software source code with each other but they are concerned about the implications in terms of legal liabilities or cross-company accounting. An InnerSource License provides a reusable legal framework for the sharing of source code within the organization. This opens up new collaboration options, and makes the rights and obligations of the involved legal entities explicit.* -* [InnerSource Portal](patterns/2-structured/innersource-portal.md) - *Create an intranet website that indexes all available InnerSource project information. This will enable potential contributors to more easily learn about projects that might interest them and for InnerSource project owners to attract an outside audience.* +* [InnerSource Portal](patterns/2-structured/innersource-portal.md) - *Potential contributors cannot easily discover InnerSource projects that they are interested in. By creating an intranet website that indexes all available InnerSource project information you enable contributors to learn about projects that might interest them and InnerSource project owners to attract an outside audience.* * [Praise Participants](patterns/2-structured/praise-participants.md) - *Thank contributors effectively to engender further engagement from them and to encourage others to contribute* * [Repository Activity Score](patterns/2-structured/repository-activity-score.md) - *The repository activity score is a numeric value that represents the (GitHub) activity of an InnerSource project.* * [Review Committee](patterns/2-structured/review-committee.md) - *The InnerSource working model is a radical departure from more traditional approaches, for developers and managers alike. By establishing a review committee as an interface between the InnerSource initiative and all senior managers of business units participating in it, the latter are more likely to familiarise themselves with the initiative and support it, as it affords them a certain level of oversight and control without fostering micromanagement.* @@ -51,10 +55,11 @@ The below lists all known patterns. They are grouped into three [maturity levels * [Start as an Experiment](patterns/2-structured/start-as-experiment.md) - *Start your InnerSource initiative as a time limited experiment to make it easier for managers unfamiliar with InnerSource to endorse and support the initiative.* * [Core Team](patterns/2-structured/core-team.md) - *Even when an InnerSource project is widely needed, contributions and usage may be hindered because the project is difficult to work with. Establish a core team that is dedicated to take care of the project's fundamental items. Their work enables contributors to add and use the features that provide value to their scenarios.* * [Document your Guiding Principles](patterns/2-structured/document-your-guiding-principles.md) - *The usual InnerSource explanation of "applying open source best practices inside an organisation" does not work well with people lacking an open source background. As a remedy the most important principles of InnerSource get documented and published widely.* +* [Extensions for Sustainable Growth](/patterns/2-initial/extensions-for-sustainable-growth.md) - *An InnerSource project is receiving too many contributions, making maintenance difficult. By offering an extension mechanism outside of the core project, the maintainers enable scaling of project capabilities with minimal cost and maintenance overhead.* ### Maturity Level 1: Initial -* [Modular Code](patterns/1-initial/modular-code.md) - *Management does not want to spend the extra resources needed to develop modular components and make them available in a visible repository for others to use.* +* [Modular Code](patterns/1-initial/modular-code.md) - *The lack of modularization in the software architecture prevents reuseability, and with that the ability to reap the benefits of InnerSource. By helping the teams to understand the benefits of modularization, and making time to work towards that goal, more InnerSource collaboration can happen and the software architecture overall can be improved.* * [Improve Findability](patterns/1-initial/improve-findability.md) - *People can't find the internally developed solutions that they need due to poor naming conventions. This causes frustration in finding InnerSource solutions and a reduction in code reuse.* * [Overcoming Project Management Time Pressures](patterns/1-initial/overcoming-project-management-time-pressures.md) - *Project management believes timeline pressure and commitments on feature content does not allow for developers to spend the time needed to develop shareable code and provide support.* * [Introducing Metrics in InnerSource](patterns/1-initial/introducing-metrics-in-innersource.md) - *Involve all stakeholders in designing and interpreting metrics to measure the current status in terms of health and performance of the InnerSource initiative.* @@ -71,10 +76,15 @@ The below lists all known patterns. They are grouped into three [maturity levels * [Unified Source Code Inventory](patterns/1-initial/source-code-inventory.md) - *In a large organization with different legal entities is often hard to get full visibility into all software assets, in particular all source code. This situation reduces the opportunities to increase business value and keep liability costs, such as software maintenance, under control across the organization as a whole. An organization-level source code inventory addresses these issues while exploiting opportunities to identify and support valuable InnerSource assets.* * [Explicit Shared Ownership](patterns/1-initial/explicit-shared-ownership.md) - *A software component that several teams depend on has grown to the point where owners are no longer capable of taking full ownership. There is confusion who to involve for changes. Sharing ownership explicitly and making expected behaviour visible removes ambiguity. Writing a contributions document creates a natural way to evolve ownership.* * [Standarized Release Process](patterns/1-initial/release-process.md) - *Teams may be reluctant to use InnerSource projects that they are unfamiliar with when there is no clear release process apparent in the repository. Providing clear release notes and a published artifact (binary, docker image, jar, etc) gives people confidence you are publishing a quality product.* -* [Overcoming the Not-Invented-Here Mindset](/patterns/1-initial/not-invented-here.md) - Perfectly good solutions are being rejected because of "Not Invented Here" (NIH). Engineers and their managers will choose to implement functionality themselves first, even if an alternative exists. A shift towards a culture of "Proudly Found Elsewhere" can help reduce the negative impact of NIH. +* [Overcoming the Not-Invented-Here Mindset](/patterns/1-initial/not-invented-here.md) - *Perfectly good solutions are being rejected because of "Not Invented Here" (NIH). Engineers and their managers will choose to implement functionality themselves first, even if an alternative exists. A shift towards a culture of "Proudly Found Elsewhere" can help reduce the negative impact of NIH.* +* [Balancing Openness and Security](/patterns/1-initial/balancing-openness-and-security.md) - *While InnerSource flourishes in environments with a high degree of shared code, Security/Legal prefers the limitation of source code access to only those that need it. By making Security/Legal part of the team, introducing explicit sharing levels and security policies for shared repositories, as well as defining what qualifies as sensitive information, code sharing can be facilitated while minimizing the associated risks.* +* [Crossing the InnerSource Chasm](/patterns/1-initial/crossing-chasm.md) - *Early InnerSource experiments have been successful. Methods that were successful convincing early teams stop working though when scaling the initiative. This chasm can be crossed by using different methods to reach people at different stages of the innovation curve.* +* [Transitioning Contractor Code to InnerSource Model](/patterns/1-initial/transitioning-contractor-code-to-innersource-model.md) - *Contract developers are often not motivated to engage in InnerSource activities, which may be beyond the scope of their contract. This pattern describes how you can focus on transitioning the contractor project after the fact to an InnerSource project by setting expectations for specific InnerSource-related deliverables as part of the overall project delivery.* +* [Incubator Pipeline](/patterns/1-initial/incubator-pipeline.md) - *A team maintaining a widely shared code library wants to accept contributions from other teams, without lowering the overall quality of their library. Therefore the shared library team uses an incubator pipeline to set a lower bar for contributions to enter and a higher bar to exit and become a top-level unit in the library.* +* [InnerSource Customer Interview Questions](/patterns/1-initial/innersource-customer-interview-questions.md) - *An organization has decided to create an InnerSource program but are unsure which issues they should address first. Using a customer interview will help evaluate pain points across the organization, to prioritize the areas where InnerSource will have the biggest positive impact.* @@ -93,7 +103,6 @@ This is why we keep these patterns at the bottom of the list. #### Donuts (needing a solution) * [How to Defeat the Hierarchical Constraints](patterns/1-initial/defeat-hierarchical-constraints.md) -* [Project Management Time Pressures](patterns/1-initial/overcoming-project-management-time-pressures.md) * [Organizational Mindset Change](patterns/1-initial/organizational-mindset-change.md) * [Bad Weather For Liftoff](patterns/1-initial/bad-weather-for-liftoff.md) * [Incentive mechanisms to foster voluntary contribution](patterns/1-initial/incentive-mechanisms-for-voluntary-contribution.md) @@ -106,16 +115,16 @@ Patterns are a way of describing a repeatable, proven solution to a problem with Patterns can provide a way for the InnerSource Commons participants to concisely share information, improving the practice of InnerSource. Patterns are divided into Title, Problem Statement, Context, Forces, and Solutions as their main sections. * [What are patterns?](https://bit.ly/innersource_patterns_videos) - Watch a set of 2-5 min videos explaining InnerSource Patterns -* [Pattern Discussion Webinar](https://youtu.be/i-0IVhfRVFU?t=1479) - We held a webinar 2017-03-16 to live-discuss a donut pattern (go to [24:40](https://youtu.be/i-0IVhfRVFU?t=1479) for the discussion). This is an illustration of the review process we follow. Also see the [June 1, 2017 O'Reilly Webinar on InnerSource Patterns](http://www.oreilly.com/pub/e/3884). +* [Pattern Discussion Webinar](https://youtu.be/i-0IVhfRVFU?t=1479) - We held a webinar 2017-03-16 to have a live discussion on a donut pattern (go to [24:40](https://youtu.be/i-0IVhfRVFU?t=1479) for the discussion). This is an illustration of the review process we follow. Also see the [June 1, 2017 O'Reilly Webinar on InnerSource Patterns](http://www.oreilly.com/pub/e/3884). * [Pattern Template File](meta/pattern-template.md) - View a skeleton InnerSource pattern to get an idea on what goes into a new pattern! * [Introduction to InnerSource Patterns (2016 Fall Summit)](https://drive.google.com/open?id=0B7_9iQb93uBQbnlkdHNuUGhpTXc) - *Tim Yao and Padma Sudarsan* (PDF). Detailed pattern background and examples -- Get a detailed understanding of why and how to interact with our patterns. Also see the [Introduction to InnerSource Patterns (2017 Fall Summit)](https://drive.google.com/open?id=0B7_9iQb93uBQWmYwMFpyaGh4OFU) *Tim Yao and Bob Hanmer* (PDF). * A scientific look at how to write patterns: [A pattern language for pattern writing](http://hillside.net/index.php/a-pattern-language-for-pattern-writing), Meszaros and Doble ## How can you use InnerSource Patterns? -Patterns must be used in a thoughtful manner. They cannot be blindly applied. In most cases, you will need to adapt the given solution to your own situation; but the information given in the pattern, defining the context (immovable constraints) and forces (constraints that can be changed and balanced against each other), should help you do this. Note that you will also need to determine if there are additional constraints (company context and company forces) that apply to your particular company/organization that must be added to the pattern (as a kind of filter). These additional constraints may require additional solution steps to be applied. +Patterns must be used in a thoughtful manner. They cannot be blindly applied. In most cases, you will need to adapt the given solution to your own situation. However, the information found in the pattern, and defining the context (immovable constraints) and forces (constraints that can be changed and balanced against each other), will help you adapt. In addition, you need to determine if there are further constraints (company context and company forces) that apply to your company/organization that must be added to the pattern. These additional constraints may require additional solution steps to be applied. -The pattern form is useful for describing proven patterns but it can also be used for *brainstorming solutions* where patterns are not yet established, since the form gives a structured way for thinking about a problem. You could also create a *donut pattern* (filling in the problem, context, forces and resulting context fields but leaving the solution blank) as a way of asking the InnerSource Commons community for help (to find a proven solution or to brainstorm things to try). +The pattern form is useful for describing proven patterns but it can also be used for *brainstorming solutions* where patterns have not yet been established, since the form provides a structured way of thinking about a problem. You could also create a *donut pattern* (filling in the problem, context, forces and resulting context fields but leaving the solution blank) as a way of asking the InnerSource Commons community for help (to find a proven solution or to brainstorm things to try). ## How to Contribute? diff --git a/TRUSTED-COMMITTERS.md b/TRUSTED-COMMITTERS.md index fab7c6e6f..7dcd8eb4a 100644 --- a/TRUSTED-COMMITTERS.md +++ b/TRUSTED-COMMITTERS.md @@ -10,6 +10,8 @@ For further information about the concept, also see the [Trusted Committer Patte ## Current Trusted Committers +* [@yuhattor](https://github.com/yuhattor) (added 2022-07-21) +* [@robtuley](https://github.com/robtuley) (added 2022-02-15) * [@spier](https://github.com/spier) (added 2020-12-11) * [@lenucksi](https://github.com/lenucksi) (added 2020-04-24) * [@NewMexicoKid](https://github.com/NewMexicoKid) (added 2017-03-02) @@ -30,25 +32,29 @@ The alumni in the Hall of Fame can of course always start contributing again in We work based on trust: Our goal is to add most people who contributed a sizeable change - quick and early. -We follow this process (adapted from [here](https://tech.europace.de/voting-in-new-trusted-committers/)): +We follow this process: -1. Any trusted committer (TC) can step forward and nominate a new TC in the private Slack channel #innersource-patterns-tcs. The TC should provide the following information: +1. Any trusted committer (TC) can nominate a new TC in the private Slack channel `#innersource-patterns-tcs`. The TC should provide the following information: * Name of the candidate * Reason for candidate * Github handle of the candidate * Slack handle of the candidate -1. Every TC can raise concerns or second the nomination in the #innersource-patterns-tcs channel. -1. If none of the existing TCs disagrees with the nomination within 72h, [lazy consensus](https://tech.europace.de/lazy-consensus-vs-explicit-voting/) is reached: The nomination is accepted. -1. The TC who nominated the candidate informs her/him in private about the nomination and its acceptance. The candidate can decide on whether to accept or reject the offer. -1. If the candidate accepts the offer, the TC who nominated the candidate, makes sure: - * New TC is added to this file (`TRUSTED-COMMITTERS.md`) - * New TC is added to `.github/CODEOWNERS`, so that they get notified about new PRs automatically - * New TC receives write access to this repository - * New TC is added to the #innersource-patterns-tcs channel - * New TC is praised in the [#innersource-patterns](https://app.slack.com/client/T04PXKRM0/C2EFRTS6A) channel. +2. Every TC can raise concerns or second the nomination in the #innersource-patterns-tcs channel. +3. If none of the existing TCs disagrees with the nomination within 72h, [lazy consensus](https://tech.europace.de/lazy-consensus-vs-explicit-voting/) is reached: The nomination is accepted. +4. The TC who nominated the candidate informs her/him in private about the nomination and its acceptance. The candidate can decide on whether to accept or reject the offer. +5. If the candidate accepts the offer, the TC who nominated the candidate, makes sure: + 1. New TC receives write access to this repository (this needs to happen first, so that step 5.iii works) + 2. New TC is added to this file (`TRUSTED-COMMITTERS.md`) + 3. New TC is added to `.github/CODEOWNERS`, so that they get notified about new PRs automatically + 4. New TC is added to the `#innersource-patterns-tcs` channel + 5. New TC is praised in the [#innersource-patterns](https://app.slack.com/client/T04PXKRM0/C2EFRTS6A) channel. ## Admins A handful of individuals are currently the technical GitHub Admins for this repository. This includes most members of the InnerSource Commons' #tech-infra team and members of the [InnerSource Commons GitHub Organization](https://github.com/innersourcecommons). However, please channel working group-specific requests through the trusted committers. + +## References + +Our trusted committer process was inspired by [this](https://tech.europace.de/voting-in-new-trusted-committers/). diff --git a/assets/img/extensions-for-sustainable-growth/README.md b/assets/img/extensions-for-sustainable-growth/README.md new file mode 100644 index 000000000..8db50a0c6 --- /dev/null +++ b/assets/img/extensions-for-sustainable-growth/README.md @@ -0,0 +1 @@ +If you want to edit the illustration, please request access to this [source document](https://docs.google.com/presentation/d/1uyvRcIIrxKedajB6XeGL21_2p60oGOi-nrU6pwk5YqA/edit#slide=id.g1af54b5764d_0_135). diff --git a/assets/img/extensions-for-sustainable-growth/extensions-for-sustainable-growth.png b/assets/img/extensions-for-sustainable-growth/extensions-for-sustainable-growth.png new file mode 100644 index 000000000..2e347f984 Binary files /dev/null and b/assets/img/extensions-for-sustainable-growth/extensions-for-sustainable-growth.png differ diff --git a/assets/img/flutter-pyramid.svg b/assets/img/flutter-pyramid.svg new file mode 100644 index 000000000..a23d324d4 --- /dev/null +++ b/assets/img/flutter-pyramid.svg @@ -0,0 +1,3 @@ + + +
1. Readable Source
1. Readable Source
2. Guest
Contributions
2. Guest...
3. Maintainers in
Multiple Teams
3. Maintainers in...
Viewer does not support full SVG 1.1
\ No newline at end of file diff --git a/assets/img/mercadolibre-trusted-committers.png b/assets/img/mercadolibre-trusted-committers.png new file mode 100644 index 000000000..aa17a2afe Binary files /dev/null and b/assets/img/mercadolibre-trusted-committers.png differ diff --git a/assets/img/portal-overview.png b/assets/img/portal-overview.png new file mode 100644 index 000000000..8269187d1 Binary files /dev/null and b/assets/img/portal-overview.png differ diff --git a/assets/img/rfc-process-uber-baseui.png b/assets/img/rfc-process-uber-baseui.png new file mode 100644 index 000000000..6039637ec Binary files /dev/null and b/assets/img/rfc-process-uber-baseui.png differ diff --git a/assets/img/santander_portal.png b/assets/img/santander_portal.png new file mode 100644 index 000000000..b5ad2e80a Binary files /dev/null and b/assets/img/santander_portal.png differ diff --git a/assets/img/standard-base-documentation/CONTRIBUTING-for-contributors.png b/assets/img/standard-base-documentation/CONTRIBUTING-for-contributors.png new file mode 100644 index 000000000..0d773f30d Binary files /dev/null and b/assets/img/standard-base-documentation/CONTRIBUTING-for-contributors.png differ diff --git a/assets/img/standard-base-documentation/README-for-users.png b/assets/img/standard-base-documentation/README-for-users.png new file mode 100644 index 000000000..0436e79aa Binary files /dev/null and b/assets/img/standard-base-documentation/README-for-users.png differ diff --git a/assets/img/standard-base-documentation/README.md b/assets/img/standard-base-documentation/README.md new file mode 100644 index 000000000..22160c45a --- /dev/null +++ b/assets/img/standard-base-documentation/README.md @@ -0,0 +1,11 @@ +# Credits + +The current illustration is a digital remake of this [original visual](/patterns/2-structured/project-setup/assets/base_docs_drawing.png). +If you want to edit this illustration, please request access to this [source document](https://docs.google.com/presentation/d/11JOByEO9QXlRLXX5BIv9rjUzPzCKErZzknD1OLcprQQ/edit?usp=sharing). + +The humans in the illustration are [bro](https://storyset.com/illustration/coding/bro) and [pana](https://storyset.com/illustration/high-five/pana) from Storyset. + +See: + +- [Web illustrations by Storyset](https://storyset.com/web) +- [People illustrations by Storyset](https://storyset.com/people) diff --git a/book/README.md b/book/README.md index 86bb76010..ce3ccff0d 100644 --- a/book/README.md +++ b/book/README.md @@ -1,28 +1,51 @@ # How to generate the InnerSource Patterns gitbook -Whenever changes to the [InnerSource Patterns][InnerSourcePatterns] GitHub repository are made, a new version of our InnerSource Patterns book is published at [patterns.innersourcecommons.org][book_production]. +Whenever changes to the [InnerSource Patterns GitHub repository][InnerSourcePatterns] are made, a new version of the InnerSource Patterns book is published at [patterns.innersourcecommons.org][book_production]. ## Where is the book published? -The most up-to-date version of the book is available for readers/consumers at [patterns.innersourcecommons.org][book_production]. +The latest version of the book is available for readers at [patterns.innersourcecommons.org][book_production]. -We also have a [Staging version][book_staging], used by the editors/producers of the book for testing purposes. If you want to make any structural changes to the book, please send a PR to merge your changes into the `book-staging` branch. That way we can test your changes on the Staging version first, before they go live. +We also have a [Staging version][book_staging], used by the editors/producers of the book for testing purposes. If you want to make structural changes to the book, please contact us via a GitHub issue first. ## Which patterns are published? -The book contains patterns of maturity **Structured** (Level 2) or **Validated** (Level 3). **Initial** (Level 1) patterns are not published in the book, because those are still subject to a lot of change, and have likely not even proven to work yet. For more on these maturity levels see the [Contributor Handbook](../meta/contributor-handbook.md). +The book contains patterns of maturity **Structured** (Level 2) or **Validated** (Level 3). -## How does it work? +**Initial** (Level 1) patterns are not published in the book. Those are still subject to a lot of change, and have likely not even proven to work yet. For more on these maturity levels see the [Contributor Handbook](../meta/contributor-handbook.md). -The `./book` folder contains generator scripts and some extra content required to create the gitbook. +## How does it work technically? -- `/.gitbook.yaml` - Holds basic configuration for the gitbook service. This never needs to be changed. -- `/book/toc.md` - An auto-generated table of contents (ToC) for the book i.e. a list of all pages and patterns that are part of the book. The ToC is what you see on the left-hand-side menu in gitbooks. -- `/book/generate_toc.rb` - Takes patterns of maturity **Structured** and **Validated**, extracts title and patlet, and injects this info into `/book/toc_template.md`. The output is written to `/book/toc.md`. -- `.github/workflows/book.yml` - A GitHub Action that triggers the execution of `/book/generate_toc.rb`. -- `/book/introduction.md` - The introduction to our book. This content is what the reader sees first when they open the book. The current content is based on [README.md](../README.md). We may need to modify this content even further, to address the readers of the book more specifically, rather than the readers of our GitHub repository. -- `/book/contribute.md` - Information about how to contribute to this book. -- `/book/explore-patterns.md` - Dedicated page in the book that highlights the mind map of all patterns. +We use the [gitbook.com](https://www.gitbook.com) service to host our book. + +The `/book` folder contains generator scripts and extra content required to create the gitbook. + +- `.github/workflows/book.yml` - A GitHub Action that triggers scripts to generate the book. +- `/book/scripts/generate_toc.rb` - Generates the table of contents (ToC) for the book. It takes patterns of maturity **Structured** and **Validated**, extracts title and patlet, and injects this info into `/book/en/toc_template.md`. The output is written to `/book/en/toc.md`. The ToC is what you see on the left-hand-side menu in the gitbook. +- `/book/en/.gitbook.yaml` - Holds basic configuration for the gitbook service. This file is copied to the root of the repo, if the English book is generated. +- `/book/en/introduction.md` - The introduction to our book. This is what the reader sees first when they open the book. *Note:* The current content is based on [README.md](../README.md). +- `/book/en/contribute.md` - Explains how to contribute to this book. +- `/book/en/explore-patterns.md` - Shows the mind map of all patterns. Allows readers to link to the mind map directly. +- patterns content: + - The English patterns are in `/patterns` + - The translated patterns (e.g. for Japanese) are in `/translation/ja` + +The book is generated in multiple languages. + +The descriptions above are for the English book. You find the English content in `/book/en`. + +For other languages (e.g. for Japanese), the content is mirrored and translated to folders like `/book/ja`. + +For more on the translation process see [these translation instructions](../translation/README.md). + +### Triggering the book generation + +The book is generated in multiple languages. + +Depending on which **branch** a change is merged into, a different book is generated: + +* changes merged to `main` branch: triggers the book generation for the **English** book. +* changes merged to `book-ja` branch: triggers the book generation for the **Japanese** book. ## Objectives of the book @@ -33,11 +56,11 @@ There are a couple of good reasons to publish the InnerSource patterns as a gitb * (consumers) have something that is “nicer” to read than things on GitHub * (consumers) search for keywords across all patterns * (consumers) export book as PDF and read on other devices -* (consumers) have stable URLs for patterns that can be used as references in other material e.g. from the Learning Path (i.e. even if the files move in the folder structure in the GitHub repo, the URL of the pattern stay the same) +* (consumers) have stable URLs for patterns that can be used as references in other material e.g. from the Learning Path (i.e. even if the files move in the folder structure in the GitHub repo, we can keep the URL of the pattern in the book the same) * (producers) a motivation for pattern authors and all contributors to level up patterns from 1-initial, as only 2-structured and 3-validated are published in the book * (producers) a motivation for us to introduce more specific quality guidelines for level 2+3, so that we can be even more proud of the content in the book :) * (producers) learn which patterns are most interesting for readers (e.g. through Google Analytics) [InnerSourcePatterns]: https://github.com/InnerSourceCommons/InnerSourcePatterns [book_production]: https://patterns.innersourcecommons.org -[book_staging]: https://innersourcecommons.gitbook.io/innersource-patterns-staging/v/book-staging/ +[book_staging]: https://innersourcecommons.gitbook.io/innersource-patterns-staging/ diff --git a/book/en/.gitbook.yaml b/book/en/.gitbook.yaml new file mode 100644 index 000000000..ee37b0bad --- /dev/null +++ b/book/en/.gitbook.yaml @@ -0,0 +1,5 @@ +root : ./ + +structure: + readme: book/en/introduction.md + summary: book/en/toc.md diff --git a/book/contribute.md b/book/en/contribute.md similarity index 87% rename from book/contribute.md rename to book/en/contribute.md index 07713f642..6bcee5324 100644 --- a/book/contribute.md +++ b/book/en/contribute.md @@ -22,10 +22,10 @@ Here a few ways in which you can contribute: For (1) and (2) above you can simply hit the **Edit on GitHub** link that you see at the top of each page in this book. This will take you straight to the respective file in our GitHub repository, where you can suggest your changes. -For (3) you need to clone the [InnerSourcePatterns][repo] repository, and add a new file with your suggested pattern. When making such larger contributions to this book please review our [CONTRIBUTING.md](../CONTRIBUTING.md) and also our [Contributor Handbook](../meta/contributor-handbook.md). +For (3) you need to clone the [InnerSourcePatterns][repo] repository, and add a new file with your suggested pattern. When making such larger contributions to this book please review our [CONTRIBUTING.md](../../CONTRIBUTING.md) and also our [Contributor Handbook](../../meta/contributor-handbook.md). ## License of Contributions -The contents of this repository are licensed under [CC-BY-SA-4.0](../LICENSE.txt). By contributing to this repository, you grant us (and everyone else for that matter) the right to use your contribution in accordance with that license. +The contents of this repository are licensed under [CC-BY-SA-4.0](../../LICENSE.txt). By contributing to this repository, you grant us (and everyone else for that matter) the right to use your contribution in accordance with that license. [repo]: https://github.com/InnerSourceCommons/InnerSourcePatterns diff --git a/book/explore-patterns.md b/book/en/explore-patterns.md similarity index 92% rename from book/explore-patterns.md rename to book/en/explore-patterns.md index 1fc8a53ef..bdc6e109a 100644 --- a/book/explore-patterns.md +++ b/book/en/explore-patterns.md @@ -6,7 +6,7 @@ Now how to make it easy for readers to discover the patterns that can help them For this purpose we provide this mind map. It **categorizes patterns based on the different phases of an InnerSource Program**, and the challenges that might appear in the respective phases. - +![Mind Map of InnerSource Patterns](../../pattern-categorization/innersource-program-mind-map.png) ## Improve this Mind Map diff --git a/book/innersource-patterns-book-cover.jpg b/book/en/innersource-patterns-book-cover.jpg similarity index 100% rename from book/innersource-patterns-book-cover.jpg rename to book/en/innersource-patterns-book-cover.jpg diff --git a/book/introduction.md b/book/en/introduction.md similarity index 94% rename from book/introduction.md rename to book/en/introduction.md index 64502aac4..944d4dfef 100644 --- a/book/introduction.md +++ b/book/en/introduction.md @@ -1,10 +1,10 @@ # Introduction - +![InnerSource Patterns book](innersource-patterns-book-cover.jpg) {% hint style="info" %} You are reading an early release of the InnerSource Patterns book and may still find broken links, spelling mistakes, or other errors. -Please help us to fix them to produce the best book possible :). Learn how to [contribute to this book](../book/contribute.md). +Please help us to fix them to produce the best book possible :). Learn how to [contribute to this book](contribute.md). {% endhint %} Welcome to the **InnerSource Patterns Book**. @@ -15,7 +15,7 @@ The [InnerSource Commons](http://innersourcecommons.org) has collected these pat In this introduction we explain [what InnerSource is](#what-is-innersource), [what a pattern is](#what-are-innersource-patterns), and [how to use these patterns](#how-can-you-use-innersource-patterns) in your organization. -If you are using InnerSource in your company already and want to contribute your experiences to this book, we would love to [welcome your contributions](../book/contribute.md)! +If you are using InnerSource in your company already and want to contribute your experiences to this book, we would love to [welcome your contributions](contribute.md)! ## What is InnerSource? @@ -35,7 +35,7 @@ Patterns can provide a way for the InnerSource Commons participants to concisely * [`What are patterns?` Youtube videos](http://bit.ly/innersource_patterns_videos) - Watch a set of 2-5 min youtube videos explaining InnerSource Patterns * [Pattern Discussion Webinar](https://youtu.be/i-0IVhfRVFU) - We held a webinar 2017-03-16 to live-discuss a donut pattern (go to 24:30 for the discussion). This is an illustration of the review process we follow. Also see the [June 1, 2017 O'Reilly Webinar on InnerSource Patterns](http://www.oreilly.com/pub/e/3884). -* [Pattern Template](../meta/pattern-template.md) - View a skeleton inner source pattern to get an idea on what goes into a new pattern! +* [Pattern Template](../../meta/pattern-template.md) - View a skeleton inner source pattern to get an idea on what goes into a new pattern! * [Introduction to InnerSource Patterns (2016 Fall Summit presentation)](https://drive.google.com/open?id=0B7_9iQb93uBQbnlkdHNuUGhpTXc) - *Tim Yao and Padma Sudarsan* (PDF). Detailed pattern background and examples -- Get a detailed understanding of why and how to interact with our patterns. Also see the [Introduction to InnerSource Patterns (2017 Fall Summit)](https://drive.google.com/open?id=0B7_9iQb93uBQWmYwMFpyaGh4OFU) *Tim Yao and Bob Hanmer* (PDF). ## How can you use InnerSource Patterns? diff --git a/book/en/toc.md b/book/en/toc.md new file mode 100644 index 000000000..6974018d4 --- /dev/null +++ b/book/en/toc.md @@ -0,0 +1,55 @@ +# Table of Contents + + + + + +* [Introduction](./introduction.md) +* [Table of Contents](./toc.md) +* [Explore Patterns](./explore-patterns.md) +* [Contribute to this book](./contribute.md) + +![Mind Map of InnerSource Patterns](../../pattern-categorization/innersource-program-mind-map.png) + +## Patterns + +* [30 Day Warranty](../../patterns/2-structured/30-day-warranty.md) - When accepting contributions from outside of your own team, there is a natural aversion to taking responsibility for code not written by the team itself. Through the 30 Day Warranty the contributing team consents to provide bug fixes to the receiving team, which will increase the level of trust between both teams and makes it more likely that contributions get accepted. +* [Common Requirements](../../patterns/2-structured/common-requirements.md) - Common code in a shared repository isn't meeting the needs of all the project-teams that want to use it; this is solved through requirements alignment and refactoring. +* [Communication Tooling](../../patterns/2-structured/project-setup/communication-tooling.md) - An InnerSource project is being used outside the original development team but users are having trouble getting help and getting in touch with the project team. The idea is to set up and document standard communication tooling that allows for discussions to become visible, archived and searchable. +* [Contracted Contributor](../../patterns/2-structured/contracted-contributor.md) - Associates wanting to contribute to InnerSource are discouraged from doing so by their line management. Relief is provided by formal contracts and agreements. +* [Core Team](../../patterns/2-structured/core-team.md) - Even when an InnerSource project is widely needed, contributions and usage may be hindered because the project is difficult to work with. Establish a core team that is dedicated to take care of the project's fundamental items. Their work enables contributors to add and use the features that provide value to their scenarios. +* [Cross-Team Project Valuation](../../patterns/2-structured/crossteam-project-valuation.md) - It's hard to sell the value of cross-team InnerSource projects that don't provide a direct impact on company revenue. Here's a data-driven way to represent your project that both articulates its value and amplifies it. +* [Dedicated Community Leader](../../patterns/2-structured/dedicated-community-leader.md) - Select people with both communications and technical skills to lead the communities to ensure success in starting an InnerSource initiative. +* [Document your Guiding Principles](../../patterns/2-structured/document-your-guiding-principles.md) - The usual InnerSource explanation of "applying open source best practices inside an organisation" does not work well with people lacking an open source background. As a remedy the most important principles of InnerSource get documented and published widely. +* [Extensions for Sustainable Growth](../../patterns/2-structured/extensions-for-sustainable-growth.md) - An InnerSource project is receiving too many contributions, making maintenance difficult. By offering an extension mechanism outside of the core project, the maintainers enable scaling of project capabilities with minimal cost and maintenance overhead. +* [Gig Marketplace](../../patterns/2-structured/gig-marketplace.md) - Establish a marketplace by creating an intranet website that lists specific InnerSource project needs as "Gigs" with explicit time and skill requirements. This will enable managers to better understand their employee’s time commitment and professional benefits thereby increasing the likelihood of garnering approval to make InnerSource contributions. +* [InnerSource License](../../patterns/2-structured/innersource-license.md) - Two legal entities that belong to the same organization want to share software source code with each other but they are concerned about the implications in terms of legal liabilities or cross-company accounting. +* [InnerSource Portal](../../patterns/2-structured/innersource-portal.md) - Potential contributors cannot easily discover InnerSource projects that they are interested in. By creating an intranet website that indexes all available InnerSource project information you enable contributors to learn about projects that might interest them and InnerSource project owners to attract an outside audience. +* [Issue Tracker Use Cases](../../patterns/2-structured/project-setup/issue-tracker.md) - The InnerSource host team fails to make not only plans and progress but also context for changes transparent. This is solved by increasing the use cases for the project issue tracker to also serve brainstorming, implementation discussion, and feature design. +* [Maturity Model](../../patterns/2-structured/maturity-model.md) - Teams have started adopting InnerSource. The practice is spreading to multiple departments. However, the understanding of what constitutes an InnerSource project varies. The solution is to provide a maturity model to allow for teams to go through a self check and discover patterns and practices that they are not yet aware of. +* [Praise Participants](../../patterns/2-structured/praise-participants.md) - After an inner source contribution, it's important to thank the contributor for their time and effort. This pattern gives guidance that not only effectively acknowledges the contribution but also engenders further engagement from the contributor and others. +* [Repository Activity Score](../../patterns/2-structured/repository-activity-score.md) - Potential contributors want to find active InnerSource projects in need of their help. By calculating a repository activity score for each project, a ranked list of projects can be created (e.g. on the InnerSource Portal), so that potential contributors can more easily determine which project they want to contribute to. +* [Review Committee](../../patterns/2-structured/review-committee.md) - The InnerSource working model is a radical departure from more traditional approaches, for developers and managers alike. By establishing a review committee as an interface between the InnerSource initiative and all senior managers of business units participating in it, the latter are more likely to familiarise themselves with the initiative and support it, as it affords them a certain level of oversight and control without fostering micromanagement. +* [Service vs. Library](../../patterns/2-structured/service-vs-library.md) - Teams in a DevOps environment may be reluctant to work across team boundaries on common code bases due to ambiguity over who will be responsible for responding to service downtime. The solution is to realize that often it's possible to either deploy the same service in independent environments with separate escalation chains in the event of service downtime or factor a lot of shared code out into one library and collaborate on that. +* [Standard Base Documentation](../../patterns/2-structured/project-setup/base-documentation.md) - New contributors to an InnerSource project have a hard time figuring out who maintains the project, what to work on, and how to contribute. Providing documentation in standard files like README.md/CONTRIBUTING.md enables a self service process for new contributors, so that they can find the answers to the most common questions on their own. +* [Start as an Experiment](../../patterns/2-structured/start-as-experiment.md) - Start your InnerSource initiative as a time limited experiment to make it easier for managers unfamiliar with InnerSource to endorse and support the initiative. +* [Transparent Cross-Team Decision Making using RFCs](../../patterns/2-structured/transparent-cross-team-decision-making-using-rfcs.md) - InnerSource projects that want to achieve high participation rates and make the best possible decisions for everybody involved need to find ways to create participatory systems throughout the full software lifecycle. Publishing internal Requests for Comments (RFCs) documents allows for discussions early on in the design process, and increases the chances to build solutions with a high degree of commitment from all involved parties. +* [Trusted Committer](../../patterns/2-structured/trusted-committer.md) - Many InnerSource projects will find themselves in a situation where they consistently receive feedback, features, and bug-fixes from contributors. In these situations, project maintainers seek ways to recognize and reward the work of the contributor above and beyond single contributions. + +## Appendix + +* [Pattern Template](../../meta/pattern-template.md) +* Extras + * [README Template](../../patterns/2-structured/project-setup/templates/README-template.md) + * [CONTRIBUTING Template](../../patterns/2-structured/project-setup/templates/CONTRIBUTING-template.md) + +## Resources + +* [This book on GitHub](https://github.com/InnerSourceCommons/InnerSourcePatterns) +* [InnerSource Commons](http://innersourcecommons.org) diff --git a/book/en/toc_template.md b/book/en/toc_template.md new file mode 100644 index 000000000..d961c2219 --- /dev/null +++ b/book/en/toc_template.md @@ -0,0 +1,34 @@ +# Table of Contents + + + + + +* [Introduction](./introduction.md) +* [Table of Contents](./toc.md) +* [Explore Patterns](./explore-patterns.md) +* [Contribute to this book](./contribute.md) + +![Mind Map of InnerSource Patterns](../../pattern-categorization/innersource-program-mind-map.png) + +## Patterns + +<> + +## Appendix + +* [Pattern Template](../../meta/pattern-template.md) +* Extras + * [README Template](../../patterns/2-structured/project-setup/templates/README-template.md) + * [CONTRIBUTING Template](../../patterns/2-structured/project-setup/templates/CONTRIBUTING-template.md) + +## Resources + +* [This book on GitHub](https://github.com/InnerSourceCommons/InnerSourcePatterns) +* [InnerSource Commons](http://innersourcecommons.org) diff --git a/book/ja/.gitbook.yaml b/book/ja/.gitbook.yaml new file mode 100644 index 000000000..6c30287cb --- /dev/null +++ b/book/ja/.gitbook.yaml @@ -0,0 +1,6 @@ +root : ./ + +structure: + readme: book/ja/introduction.md + summary: book/ja/toc.md + \ No newline at end of file diff --git a/book/ja/contribute.md b/book/ja/contribute.md new file mode 100644 index 000000000..ffe6837ce --- /dev/null +++ b/book/ja/contribute.md @@ -0,0 +1,32 @@ +# この本にコントリビュートするには + +この本をもっと良くしたいですか? 素敵ですね、やりましょう! + +インナーソース・パターンブックは[オープンソースプロジェクト](https://github.com/InnerSourceCommons/InnerSourcePatterns)ですので、どんな形でのコントリビューションでも、そしてどんな些細なことでもかまいません! +文法やスペルの修正やデザインの改善から、あなたの職場で行われたインナーソースの経験に基づいた全く新しいパターンの提案まで、私たちはどんなコントリビューションでも喜んで歓迎します! +あなたがオープンソースプロジェクトにコントリビュートしたことがない場合でも大丈夫ご心配なく。インナーソース・パターンのコミュニティはフレンドリーな人々のグループですので、コントリビュートするのに安全な場所です。 + +## 始める前に + +インナーソース・パターンとこの本のソースは、GitHub のリポジトリで保管されています。そのため、この本の編集や提案を行うには、GitHub のユーザーアカウントが必要です。もしまだそれを持っていないなら、[github.com](https://github.com) で無料のアカウントを作成してください。 + +## コントリビュートするさまざまな方法 + +ここでは、あなたがコントリビュートできるいくつかの方法を紹介します。 + +1. この本で気づいたスペルやフォーマットなどの不具合を修正する +1. 既存のパターンの内容を改善する(例えば、 _既知の例_ としてパターンを使用している方法についての短い説明を追加する) +1. 新しいパターンを投稿し、あなたの組織でインナーソースに関する課題をどのように克服したかを説明する + +上記の(1)と(2)については、本書の各ページの上部にある **Edit on GitHub** のリンクを押すだけです。この操作では、私たちの GitHub リポジトリ内のそれぞれのファイルに直接移動し、各ページであなたの変更を提案することができます。 + +(3) については、[インナーソース・パターン](https://github.com/InnerSourceCommons/InnerSourcePatterns) リポジトリをクローンし、あなたの提案するパターンを新しいファイルに追加する必要があります。このような大きなコントリビュートする場合は、私たちの [CONTRIBUTING.md(英語)](../../CONTRIBUTING.md) と [Contributor Handbook(英語)](../../meta/contributor-handbook.md) を確認してください。 + +## コントリビューションにかかるライセンス + +このリポジトリのコンテンツは [CC-BY-SA-4.0](../../LICENSE.txt) の下でライセンスされています。このリポジトリにコントリビュートすることは、私たち(そして他のすべての人)に対して、このライセンスに従ってあなたのコントリビューション物を使用する権利を与えることになります。 + +## 翻訳の履歴 + +- **2022-05-23** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-15** - レビュー [@johtani](https://github.com/johtani) diff --git a/book/ja/explore-patterns.md b/book/ja/explore-patterns.md new file mode 100644 index 000000000..164087eaf --- /dev/null +++ b/book/ja/explore-patterns.md @@ -0,0 +1,23 @@ +# パターンを探る + +とても素晴らしいことに、インナーソース・コモンズのコミュニティから、どんどんパターンが寄稿されています! + +さて、ではどのように特定の自分の状況に役立つパターンを読者は簡単に見つけられるでしょうか? +そこで私たちはこのマインドマップを提供します。このマインドマップは、**インナーソースプログラムのさまざまなフェーズと、それぞれのフェーズで現れる可能性のある課題に基づいてパターンを分類しています。** + +![インナーソース・パターンのマインドマップ](../../pattern-categorization/innersource-program-mind-map.png) + +## このマインドマップを改善する + +もし、このマインドマップを何かおかしいと感じた場合、その問題点と修正すべき点を記述した[イシューを作成](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues)してください。 + +さらに、これらのパターンの発見性を向上させるための他のアイデアや、このマインドマップをより良くしたい場合は、[パターン分類](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/pattern-categorization/README.md)アプローチのドキュメントを確認し、[この本へのコントリビューション](contribute.md)の方法も確認してみてください。 + +## リファレンス + +このようにパターンを分類するアイデアは、Tim Yao さん、Bob Hanmer さん、Padma Sudarsanshi さんによる[Thoughts on an InnerSource Pattern Language](https://drive.google.com/file/d/13AY8glCOdpLOVuz7cVD6QOB8d2xbHCS1/view) (2018) の記述を大まかに元にしています。具体的な内容はそのスライドデックの15ページ目をご覧ください。 + +## 翻訳の履歴 + +- **2022-05-23** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-15** - レビュー [@johtani](https://github.com/johtani) diff --git a/book/ja/innersource-patterns-book-cover.jpg b/book/ja/innersource-patterns-book-cover.jpg new file mode 100644 index 000000000..e3a9e2635 Binary files /dev/null and b/book/ja/innersource-patterns-book-cover.jpg differ diff --git a/book/ja/introduction.md b/book/ja/introduction.md new file mode 100644 index 000000000..f4320aa51 --- /dev/null +++ b/book/ja/introduction.md @@ -0,0 +1,81 @@ +# イントロダクション + +![InnerSource Patterns book](innersource-patterns-book-cover.jpg) + +{% hint style="info" %} +あなたが読んでいるインナーソースパターンは初期のリリースフェイズです。リンクが壊れていたりスペルミスやエラーがある可能性があります。 +できる限りベストな本を作成するために是非修正にご協力ください。[本へのコントリビューション](./contribute.md)方法についてはこちらをご参照ください。 +{% endhint %} + +**インナーソースパターンブック**へようこそ。 + +この本では、インナーソースのベストプラクティスを理解しやすい特定のフォーマットで体系化し、評価し、あなたの環境で適用しやすくまとめています。このフォーマットを私たちは "パターン" と読んでいます。 + +[インナーソース](http://innersourcecommons.org) は、長年にわたってこれらのパターンを収集し、この本で最も成熟したパターンを公開しています。また、コミュニティのメンバーが、少なくとも一つの事例をもって、それぞれのパターンをレビューしています。 + + +このイントロダクションでは、[インナーソースとは何か](#innssutohaka)、[パターンとは何か](#innssupatntohaka)、そしてあなたの組織における[これらのパターンの使い方](#donoyouniinnssupatnwouka) について説明します。 + +もしあなたが既に会社でインナーソースを使っていて、その経験を本書に提供したいのであれば、ぜひ[本書へのコントリビューション](./contribute.md)をよろしくお願いします! + +## インナーソースとは何か + +私たちはインナーソースを次のように定義しています。 + +> 組織という限られた環境において、ソフトウェア開発におけるオープンソースの原則とプラクティスを活用すること + +インナーソースは、オープンソースソフトウェアの開発から得た教訓を、企業の社内でのソフトウェア開発のあり方に応用します。 開発者は世界トップクラスのオープンソースソフトウェアに慣れるにつれて、これらの手法をファイアウォールの内側に戻し、企業がリリースを躊躇するようなソフトウェアに適用したいと強く思うようになりました。 + +インナーソースは、主にクローズドソースのソフトウェアを構築している企業にとって、サイロの解消、社内コラボレーションの促進および拡大、新しいエンジニアのオンボーディングの促進、そしてオープンソースの世界にソフトウェアを還元するチャンスを探るのに役立つ役立つ素晴らしいツールです。 + +## インナーソースパターンとは何か + +パターンとは、ある状況の中で、問題に対する再現可能で実績のある解決策を記述する方法です。 +パターンは、ソリューションを適用する際に、問題の制約を理解し、バランスをとる必要のある力を理解し、ソリューションを適用した結果生じる状況を理解することをたすけるシンプルなフォーマットに従っています。 + +パターンは、インナーソース・コモンズ の参加者が情報を簡潔に共有し、インナーソースのプラクティスを磨く方法を提供しており、タイトル、問題提起、状況、フォース、ソリューションを主要なセクションとして分けて構成してあります。 + +* [`パターンとは何か` Youtube ビデオ](http://bit.ly/innersource_patterns_videos) - インナーソースパターンを説明する2-5分のyoutubeビデオのセットをご覧ください +* [パターンディスカッション ウェビナー](https://youtu.be/i-0IVhfRVFU) - 2017年3月16日にウェビナーを開催し、ドーナツパターンをライブディスカッションしました(ディスカッションは24:30から)。これは、私たちが行うレビュープロセスの実例です。 +* 合わせてこちらもご覧下さい [2017年6月1日 インナーソースパターンに関する O'Reilly ウェビナー](http://www.oreilly.com/pub/e/3884). +* [パターンテンプレート](../../meta/pattern-template.md) - インナーソースパターンの概略を見て、新しいパターンの中身を知ることができます +* [インナーソースパターンの紹介 (2016 Fall Summit presentation)](https://drive.google.com/open?id=0B7\_9iQb93uBQbnlkdHNuUGhpTXc) - _Tim Yao and Padma Sudarsan_ (PDF) 「パターンとの付き合い方 - 手法と理由を詳しく理解する」合わせてこちらもご覧ください - [インナーソースパターン入門 (2017 Fall Summit)](https://drive.google.com/open?id=0B7\_9iQb93uBQWmYwMFpyaGh4OFU) _Tim Yao and Bob Hanmer_ (PDF) + +## どのようにインナーソースパターンを使うか + +パターンは無差別に適用するのではなく、よく考えて使わなければなりません。 + +ほとんどの場合、与えられたソリューションを自分達の状況に合わせる必要がありますが、パターンで与えられている情報、コンテキスト(動かせない制約)とフォース(変更可能な制約、相互にバランスをとる制約)の定義は、ソリューションを適用するのに役立つはずです。 またパターンに追加すべき項目として、あなたの特定の企業/組織に適用さる追加の制約があるかを決定する必要があることにも注意してください。 +これらの追加の制約のためには、追加のソリューションステップを適用する必要があるかもしれません。 + +パターンのフォーマットは実績のあるソリューションを記述するのに便利ですが、パターンがまだ確立されていない新しいソリューションに関する _ブレインストーミング_ にも使用できます。これは、パターンの構造が、構造化された方法で問題について考えるためのフレームワークになっているからです。 + +また、インナーソース・コモンズのコミュニティに助けを求める方法として、ドーナツ・パターン(問題、状況、フォース、結果の状態のフィールドを記載し、ソリューションの欄は空白にする)を作ることもできます。(実証済みのソリューションを見つけるために、または試してみるためにブレインストーミングを実施します) + +## コントリビュートするには + +こちらをご参照ください。 +[この本にコントリビュートするには](./contribute.md) + +## クレジット + +この本は、世界中の無数の[オープンソースコントリビューター](https://github.com/InnerSourceCommons/InnerSourcePatterns/graphs/contributors)の方々による長年のワークの結果です。 + +この本は、彼らの会社で直面した課題を率直に共有することや、どのようにそのチャレンジに InnerSource が役立ったかをオープンに共有ことに対する彼らの意欲によって素晴らしいものになっています。インナーソースの旅を始めようとしている方々にとって、とても貴重なリソースになるでしょう。 + +またインナーソース・パターンのワーキンググループに関しても言及させてください。彼らは、インナーソース・パターンのクオリティを育て、他の人がコントリビュートするのを支援してきました。 + +最後に、彼らはこの本に利用可能なパターンを選択してまとめています。この本のタイトル画像は、[CC BY 2.0](https://creativecommons.org/licenses/by/2.0/)で利用可能な [Tony Hisgett - Alhambra 6](https://www.flickr.com/photos/hisgett/29345405788/) による画像を基に [Sebastian Spier氏](https://spier.hu)によって作成されています。 + +**コントリビューターのみなさま、ありがとうございます!そして、良いインナーソースの日をお送りください😃** + +## ライセンス + +![Creative Commons License](https://i.creativecommons.org/l/by-sa/4.0/88x31.png) + +インナーソース・パターンは [InnerSourceCommons.org](http://innersourcecommons.org) によりライセンスされ、[Creative Commons Attribution-ShareAlike 4.0 International](http://creativecommons.org/licenses/by-sa/4.0/) ライセンスで提供されています。 + +## 翻訳の履歴 + +- **2022-05-23** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-15** - レビュー [@johtani](https://github.com/johtani) diff --git a/book/ja/toc.md b/book/ja/toc.md new file mode 100644 index 000000000..8a03f33d8 --- /dev/null +++ b/book/ja/toc.md @@ -0,0 +1,54 @@ +# 目次 + + + + + +* [イントロダクション](./introduction.md) +* [目次](./toc.md) +* [パターンの一覧](./explore-patterns.md) +* [この本へのコントリビューション](./contribute.md) + +![インナーソースパターンのマインドマップ](../../pattern-categorization/innersource-program-mind-map.png) + +## パターン + +* [30日の保証期間](../../translation/ja/patterns/30-day-warranty.md) - 自分のチーム以外からのコントリビューションを受け入れる場合、チームが書いていないコードの責任を持つことに抵抗があることは自然なことでしょう。 「30日の保証期間」プラクティスを利用すると、コードにコントリビュートしたチームはコードを受け取ったチームに対してバグフィックスを提供することを承諾することになります。 そうすることで、両チーム間の信頼度が高まり、コントリビューションが受け入れられる可能性が高くなります。 +* [RFCを用いたチーム横断的な意思決定の透明化](../../translation/ja/patterns/transparent-cross-team-decision-making-using-rfcs.md) - 高い参加率を達成し、関係者全員にとって最良の意思決定を行いたいインナーソースプロジェクトは、ソフトウェアのライフサイクル全体を通して参加型のシステムを構築する方法を見つける必要があります。内部のRFC(Requests for Comments)ドキュメントを公開することで、設計プロセスの早い段階から議論を行うことができ、関係者全員が高いコミットメントを持ってソリューションを構築できる可能性が高まります。 +* [イシュートラッカーの使い方を多様化する](../../translation/ja/patterns/issue-tracker.md) - インナーソースのホストチームは、計画や進捗だけでなく、変更の背景も透明化することができていません。これは、プロジェクトのイシュートラッカーのユースケースを増やし、ブレーンストーミング、実装の議論、機能設計にも使えるようにすることで解決することができます。 +* [インナーソースポータル](../../translation/ja/patterns/innersource-portal.md) - 潜在的なコントリビューターは、彼らが興味を持っているインナーソースプロジェクトを簡単に見つけることができません。すべての利用可能なインナーソースプロジェクトの情報をインデックス化するイントラネットのウェブサイトを作成することにより、あなたはコントリビューターが彼らに興味があるかもしれないプロジェクトについて知ることができ、インナーソースプロジェクトのオーナーは、外部のオーディエンスを引き付けることができます。 +* [インナーソースライセンス](../../translation/ja/patterns/innersource-license.md) - 同じ組織に属する2つの法人は、ソフトウェアのソースコードを互いに共有したいと考えていますが、法的責任や会社間の会計処理の観点からの影響を懸念しています。 +* [ギグマーケットプレイス](../../translation/ja/patterns/gig-marketplace.md) - イントラネットのウェブサイトを作成し、特定のインナーソースプロジェクトのニーズを、時間とスキルの要件を明示した「ギグ」としてリストアップすることで、マーケットプレイスを確立する。 これにより、管理者がインナーソースのコントリビューションを行うための承認を与え可能性が増え、従業員の時間のコミットメントと専門的な利点をよりよく理解することができます。 +* [クロスチームプロジェクト評価](../../translation/ja/patterns/crossteam-project-valuation.md) - 会社の収益に直接的な影響を提供していないクロスチームのインナーソースプロジェクトの価値を評価して社内に売り込むことは困難です。 ここでは、あなたのプロジェクトの価値を明確に表現し、それを大きくするためのデータ駆動型の方法を紹介します +* [コアチーム](../../translation/ja/patterns/core-team.md) - インナーソースのプロジェクトが広く必要とされていても、プロジェクトが難しいためにコントリビューションや活用に支障をきたす場合があります。プロジェクトの基本的な項目を専門に担当するコアチームを設立してください。コアチームの作業により、コントリビューターは自分のシナリオに価値をもたらす機能を追加し、使用することができます。 +* [コミュニケーションツーリング](../../translation/ja/patterns/communication-tooling.md) - インナーソースのプロジェクトは、開発チームの外で使用されていますが、ユーザーはヘルプを得たり、プロジェクトチームと連絡を取ったりするのに苦労しています。 このアイデアは、ディスカッションが可視化され、アーカイブされ、検索可能になることを可能にする標準的なコミュニケーションツールを設定し、文書化することです。 +* [コントラクトコントリビューター](../../translation/ja/patterns/contracted-contributor.md) - インナーソースにコントリビュートしたい社員がいますが、彼らの直属の上司はその活動に抵抗を示しています。正式な契約と合意をすることによって救済することができるかもしれません。 +* [コントリビューションの功労を称える](../../translation/ja/patterns/praise-participants.md) - インナーソースのコントリビューションの後、その時間と努力に対してコントリビューターに感謝することは重要です。 このパターンは、コントリビューションを効果的に認めるだけでなく、コントリビューターや他の人たちのさらなる関与を引き出すためのガイダンスを提供します。 +* [サービス対ライブラリ](../../translation/ja/patterns/service-vs-library.md) - DevOps環境のチームは、サービスのダウンタイムに対応する責任が誰にあるのかが曖昧になるため、チームの境界を越えて共通のコードベースで作業することに消極的になる場合があります。解決策としては、同じサービスを独立した環境で展開し、サービスダウン時のエスカレーション・チェーンを別々に構築するか、多くの共有コードを1つのライブラリに集約し、その上で共同作業を行うことが挙げられます。 +* [スタンダード・ベース・ドキュメンテーション](../../translation/ja/patterns/base-documentation.md) - インナーソースプロジェクトへの新しいコントリビューターは、誰がプロジェクトを維持し、何に取り組み、どのようにコントリビューションすればよいかを理解するのに苦労しています。README.md/CONTRIBUTING.md のような標準ファイルでドキュメントを提供することで、新しいコントリビューターのためのセルフサービスなプロセスを可能にし、よくある質問に対する答えを自分自身で見つけることができるようにします。 +* [トラステッドコミッター](../../translation/ja/patterns/trusted-committer.md) - 多くのInnerSourceプロジェクトは、コントリビューターからフィードバック、機能、バグフィックスを一貫して受け取る状況にあります。このような状況で、プロジェクトのメンテナーは、単一のコントリビューションを越えてコントリビューターの仕事を認識し、報酬を与える方法を模索します。 +* [リポジトリアクティビティスコア](../../translation/ja/patterns/repository-activity-score.md) - 潜在的なコントリビューターは、彼らの助けを必要とするアクティブなインナーソースプロジェクトを見つけたいと思っています。各プロジェクトのリポジトリのアクティビティスコアを計算することで、プロジェクトのランク付けされたリストを作成することができます (参考: インナーソースポータル )、そのため、潜在的コントリビューターは、彼らがコントリビュートしたいプロジェクトをより簡単に決定できます。 +* [レビュー委員会](../../translation/ja/patterns/review-committee.md) - インナーソースの作業モデルは、開発者と管理者のための、より伝統的なアプローチからの抜本的な変革です。インナーソースイニシアチブとそれに参加するビジネスユニットのすべてのシニアマネージャーの間のインタフェースとしてレビュー委員会を確立することにより、マイクロマネジメントを助長することなく、監視と制御の一定レベルを与えるように、イニシアチブに慣れ親しみ、それをサポートできるようになる可能性が高くなります。 +* [共通要件](../../translation/ja/patterns/common-requirements.md) - 共有リポジトリにある共通のコードは、それを使いたいすべてのプロジェクトチームのニーズを満たしていません。これは、要件の調整とリファクタリングによって解決されます。 +* [基本原則ガイダンスの文書化](../../translation/ja/patterns/document-your-guiding-principles.md) - 「オープンソースのベストプラクティスを組織内に適用する」という通常のインナーソースの説明は、オープンソースのバックグラウンドがない人々にはうまく機能しません。 解決策として、インナーソースの最も重要な原則を文書化し広く公開しましょう。 +* [実験として始める](../../translation/ja/patterns/start-as-experiment.md) - インナーソースイニシアチブを期間限定の実験として開始し、インナーソースに慣れていないマネージャーがイニシアチブを承認およびサポートしやすくします。 +* [成熟度モデル](../../translation/ja/patterns/maturity-model.md) - チームはインナーソースを採用し始めました。このプラクティスは、複数の部門に広がっています。しかし、インナーソースプロジェクトを構成する概念への理解は様々です。解決策は、チームがセルフチェックを経て、まだ気づいていないパターンやプラクティスを発見できるよう、成熟度モデルを提供することです。 +* [正式なコミュニティリーダー](../../translation/ja/patterns/dedicated-community-leader.md) - インナーソースの取り組みを成功させるために、コミュニケーションとテクニカルの両方のスキルを持つ人をコミュニティのリーダーとして選ぶ。 + +## 付録 + +* [パターンテンプレート](../../meta/pattern-template.md) +* その他 + * [README テンプレート](../../translation/ja/templates/README-template.md) + * [CONTRIBUTING テンプレート](../../translation/ja/templates/CONTRIBUTING-template.md) + +## リソース + +* [GitHub](https://github.com/InnerSourceCommons/InnerSourcePatterns) +* [InnerSource Commons](http://innersourcecommons.org) diff --git a/book/ja/toc_template.md b/book/ja/toc_template.md new file mode 100644 index 000000000..01ab26bbe --- /dev/null +++ b/book/ja/toc_template.md @@ -0,0 +1,34 @@ +# 目次 + + + + + +* [イントロダクション](./introduction.md) +* [目次](./toc.md) +* [パターンの一覧](./explore-patterns.md) +* [この本へのコントリビューション](./contribute.md) + +![インナーソースパターンのマインドマップ](../../pattern-categorization/innersource-program-mind-map.png) + +## パターン + +<> + +## 付録 + +* [パターンテンプレート](../../meta/pattern-template.md) +* その他 + * [README テンプレート](../../translation/ja/templates/README-template.md) + * [CONTRIBUTING テンプレート](../../translation/ja/templates/CONTRIBUTING-template.md) + +## リソース + +* [GitHub](https://github.com/InnerSourceCommons/InnerSourcePatterns) +* [InnerSource Commons](http://innersourcecommons.org) diff --git a/book/scripts/.gitignore b/book/scripts/.gitignore new file mode 100644 index 000000000..231a148ca --- /dev/null +++ b/book/scripts/.gitignore @@ -0,0 +1,3 @@ +Gemfile.lock +/vendor/ +.bundle \ No newline at end of file diff --git a/book/Gemfile b/book/scripts/Gemfile similarity index 100% rename from book/Gemfile rename to book/scripts/Gemfile diff --git a/book/generate_toc.rb b/book/scripts/generate_toc.rb similarity index 73% rename from book/generate_toc.rb rename to book/scripts/generate_toc.rb index d6fa71092..391e03310 100644 --- a/book/generate_toc.rb +++ b/book/scripts/generate_toc.rb @@ -49,7 +49,6 @@ def extract_text(node) return section_nodes end - def generate_patterns_overview(patterns) pattern_overview = Hash.new() @@ -68,12 +67,23 @@ def generate_patterns_overview(patterns) # Main block -TOC_TEMPLATE_FILE = "./toc_template.md" -TOC_FILE = "./toc.md" +## 2-letter language code of the book to-be-generated is passed into this script. +BOOK_LANGUAGE = ARGV[0] +puts "Generating ToC for language: #{BOOK_LANGUAGE}" + +## Files to be used for the different languages +if (BOOK_LANGUAGE == "ja") + TOC_TEMPLATE_FILE = "../ja/toc_template.md" + TOC_FILE = "../ja/toc.md" + PATTERNS = Dir["../../translation/ja/patterns/*.md"] +else + TOC_TEMPLATE_FILE = "../en/toc_template.md" + TOC_FILE = "../en/toc.md" + PATTERNS = Dir["../../patterns/2-structured/*.md","../../patterns/2-structured/project-setup/*.md", "../../patterns/3-validated/*.md"] +end -## Generate list of patterns and sort them by name -patterns = Dir["../patterns/2-structured/*.md","../patterns/2-structured/project-setup/*.md", "../patterns/3-validated/*.md"] -pattern_overview = generate_patterns_overview(patterns) +# Generate list of patterns and sort them by name +pattern_overview = generate_patterns_overview(PATTERNS) pattern_overview = pattern_overview.sort.to_h toc_snippet = pattern_overview.map{|title, values| "* [#{title}](#{values[:file]}) - #{values[:patlet]}"} @@ -86,4 +96,4 @@ def generate_patterns_overview(patterns) ## Write the new ToC to file File.write(TOC_FILE, new_toc_content) -puts "Written new ToC for book to #{TOC_FILE}" +puts "Written new ToC for #{BOOK_LANGUAGE} book to #{TOC_FILE}" diff --git a/book/toc.md b/book/toc.md deleted file mode 100644 index 82a6dbc58..000000000 --- a/book/toc.md +++ /dev/null @@ -1,52 +0,0 @@ - - - - -# Table of Contents - -* [Table of Contents](../book/toc.md) -* [Explore Patterns](../book/explore-patterns.md) -* [Contribute to this book](../book/contribute.md) - - - -## Patterns - -* [30 Day Warranty](../patterns/2-structured/30-day-warranty.md) - When accepting contributions from outside of your own team, there is a natural aversion to taking responsibility for code not written by the team itself. Through the 30 Day Warranty the contributing team consents to provide bug fixes to the receiving team, which will increase the level of trust between both teams and makes it more likely that contributions get accepted. -* [Common Requirements](../patterns/2-structured/common-requirements.md) - Common code in a shared repository isn't meeting the needs of all the project-teams that want to use it; this is solved through requirements alignment and refactoring. -* [Communication Tooling](../patterns/2-structured/project-setup/communication-tooling.md) - An InnerSource project is being used outside the original development team but users are having trouble getting help and getting in touch with the project team. The idea is to set up and document standard communication tooling that allows for discussions to become visible, archived and searchable. -* [Contracted Contributor](../patterns/2-structured/contracted-contributor.md) - Associates wanting to contribute to InnerSource are discouraged from doing so by their line management. Relief is provided by formal contracts and agreements. -* [Core Team](../patterns/2-structured/core-team.md) - Even when an InnerSource project is widely needed, contributions and usage may be hindered because the project is difficult to work with. Establish a core team that is dedicated to take care of the project's fundamental items. Their work enables contributors to add and use the features that provide value to their scenarios. -* [Cross-Team Project Valuation](../patterns/2-structured/crossteam-project-valuation.md) - It's hard to sell the value of cross-team InnerSource projects that don't provide a direct impact on company revenue. Here's a data-driven way to represent your project that both articulates its value and amplifies it. -* [Dedicated Community Leader](../patterns/2-structured/dedicated-community-leader.md) - Select people with both communications and technical skills to lead the communities to ensure success in starting an InnerSource initiative. -* [Gig Marketplace](../patterns/2-structured/gig-marketplace.md) - Establish a marketplace by creating an intranet website that lists specific InnerSource project needs as "Gigs" with explicit time and skill requirements. This will enable managers to better understand their employee’s time commitment and professional benefits thereby increasing the likelihood of garnering approval to make InnerSource contributions. -* [InnerSource License](../patterns/2-structured/innersource-license.md) - Two legal entities that belong to the same organization want to share software source code with each other but they are concerned about the implications in terms of legal liabilities or cross-company accounting. -* [InnerSource Portal](../patterns/2-structured/innersource-portal.md) - Create an intranet website that indexes all available InnerSource project information. This will enable potential contributors to more easily learn about projects that might interest them and for InnerSource project owners to attract an outside audience. -* [Issue Tracker Use Cases](../patterns/2-structured/project-setup/issue-tracker.md) - The InnerSource host team fails to make not only plans and progress but also context for changes transparent. This is solved by increasing the use cases for the project issue tracker to also serve brainstorming, implementation discussion, and feature design. -* [Maturity Model](../patterns/2-structured/maturity-model.md) - Teams have started adopting InnerSource. The practice is spreading to multiple departments. However, the understanding of what constitutes an InnerSource project varies. The solution is to provide a maturity model to allow for teams to go through a self check and discover patterns and practices that they are not yet aware of. -* [Praise Participants](../patterns/2-structured/praise-participants.md) - After an inner source contribution, it's important to thank the contributor for their time and effort. This pattern gives guidance that not only effectively acknowledges the contribution but also engenders further engagement from the contributor and others. -* [Repository Activity Score](../patterns/2-structured/repository-activity-score.md) - Potential contributors want to find active InnerSource projects in need of their help. By calculating a repository activity score for each project, a ranked list of projects can be created (e.g. on the InnerSource Portal), so that potential contributors can more easily determine which project they want to contribute to. -* [Review Committee](../patterns/2-structured/review-committee.md) - The InnerSource working model is a radical departure from more traditional approaches, for developers and managers alike. By establishing a review committee as an interface between the InnerSource initiative and all senior managers of business units participating in it, the latter are more likely to familiarise themselves with the initiative and support it, as it affords them a certain level of oversight and control without fostering micromanagement. -* [Service vs. Library](../patterns/2-structured/service-vs-library.md) - Teams in a DevOps environment may be reluctant to work across team boundaries on common code bases due to ambiguity over who will be responsible for responding to service downtime. The solution is to realize that often it's possible to either deploy the same service in independent environments with separate escalation chains in the event of service downtime or factor a lot of shared code out into one library and collaborate on that. -* [Standard Base Documentation](../patterns/2-structured/project-setup/base-documentation.md) - New contributors to an InnerSource project have a hard time figuring out who maintains the project, what to work on, and how to contribute. Providing documentation in standard files like README.md/CONTRIBUTING.md enables a self service process for new contributors, so that they can find the answers to the most common questions on their own. -* [Start as an Experiment](../patterns/2-structured/start-as-experiment.md) - Start your InnerSource initiative as a time limited experiment to make it easier for managers unfamiliar with InnerSource to endorse and support the initiative. -* [Transparent Cross-Team Decision Making using RFCs](../patterns/2-structured/transparent-cross-team-decision-making-using-rfcs.md) - InnerSource projects that want to achieve high participation rates and make the best possible decisions for everybody involved need to find ways to create participatory systems throughout the full software lifecycle. Publishing internal Requests for Comments (RFCs) documents allows for discussions early on in the design process, and increases the chances to build solutions with a high degree of commitment from all involved parties. -* [Trusted Committer](../patterns/2-structured/trusted-committer.md) - Many InnerSource projects will find themselves in a situation where they consistently receive feedback, features, and bug-fixes from contributors. In these situations, project maintainers seek ways to recognize and reward the work of the contributor above and beyond single contributions. - -## Appendix - -* [Pattern Template](../meta/pattern-template.md) -* Extras - * [README Template](../patterns/2-structured/project-setup/templates/README-template.md) - * [CONTRIBUTING Template](../patterns/2-structured/project-setup/templates/CONTRIBUTING-template.md) - -## Resources - -* [This book on GitHub](https://github.com/InnerSourceCommons/InnerSourcePatterns) -* [InnerSource Commons](http://innersourcecommons.org) diff --git a/book/toc_template.md b/book/toc_template.md deleted file mode 100644 index a00058e11..000000000 --- a/book/toc_template.md +++ /dev/null @@ -1,33 +0,0 @@ - - - - -# Table of Contents - -* [Table of Contents](../book/toc.md) -* [Explore Patterns](../book/explore-patterns.md) -* [Contribute to this book](../book/contribute.md) - - - -## Patterns - -<> - -## Appendix - -* [Pattern Template](../meta/pattern-template.md) -* Extras - * [README Template](../patterns/2-structured/project-setup/templates/README-template.md) - * [CONTRIBUTING Template](../patterns/2-structured/project-setup/templates/CONTRIBUTING-template.md) - -## Resources - -* [This book on GitHub](https://github.com/InnerSourceCommons/InnerSourcePatterns) -* [InnerSource Commons](http://innersourcecommons.org) diff --git a/meta/README.md b/meta/README.md index 835268ba6..f2e801aef 100644 --- a/meta/README.md +++ b/meta/README.md @@ -9,6 +9,9 @@ The topics below cover information about how we define, operate, and upkeep this * [FAQ](./FAQ.md) - Frequently asked questions about InnerSource Patterns * [Trusted Committers](../TRUSTED-COMMITTERS.md) - Who these people are, what elevated rights they get, and how you can become one * [Markdown Info](./markdown-info.md) - Markdown is the ascii text format our patterns are written in; this document briefly defines how we use it +* [Style Guide](./pattern-style-guide.md) - Recommended conventions to use when writing patterns +* [Glossary](./glossary.md) - Defines essential terms that are commonly used when writing new patterns. +* [Board Reports](./boardreports) - The Patterns Working Group submits a report to the Board of the InnerSource Commons Foundation on a quarterly basis. This folder contains all reports that the Patterns Working Group has created. ## Unfinished documentation diff --git a/meta/boardreports/2022-02.md b/meta/boardreports/2022-02.md new file mode 100644 index 000000000..8904019ae --- /dev/null +++ b/meta/boardreports/2022-02.md @@ -0,0 +1,58 @@ +# InnerSource Patterns WG - Report for Governance Meeting 2022-02 + +## Reporting Period + +Nov 1st, 2021 - Jan 31st, 2022 + +## Mission + +*Briefly describe what your project actually does.* + +- Discuss community InnerSource practices and dynamics, collect and document agreed upon best practices of how to do InnerSource - in the form of patterns +- Continuously publish the most mature patterns as an ebook and website + +## Overview + +- 1 new pattern +- ~6500 page views of our [patterns book](https://patterns.innersourcecommons.org/) / ~ 72 per day +- some more discussions about patterns are happening in #innersource-patterns +- patterns get mentioned frequently in Community Calls +- improvements to our [Contributor Handbook](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/meta/contributor-handbook.md) might help others to review PRs +- struggling to find more Trusted Committers +- no office hours in EU/Americas time slots + +## Pattern Work + +- new Initial pattern: [Balancing Openness and Security](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/balancing-openness-and-security.md) (aka "Secure InnerSource" by two new contributors (@bartgolsteijn and @arlou) +- new Structured pattern (published in our book): [Document your Guiding Principles](https://patterns.innersourcecommons.org/p/document-your-guiding-principles) +- merging old PRs of Initial patterns by @nyeates that had been stale since 2017 (readers are more likely to find pattern ideas in the main branch than in PRs): + - [Overcoming the Not-Invented-Here Mindset](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/not-invented-here.md) + - [Culture Change through Hiring](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/cultural-change-through-hiring.md) +- new pattern ideas: + - InnerSource Contractor Model Terms - @claredillon + - Transitioning Contractor Code to InnerSource Model - @claredillon + - Hive mind - @mishari + - Truth and Reconcilliation - @mishari + - Operational Model for InnerSource - @dicortazar +- all: [merged PRs](https://github.com/InnerSourceCommons/InnerSourcePatterns/pulls?q=is%3Apr+closed%3A2021-11-01..2022-01-31+is%3Amerged+), [opened issues](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues?q=is%3Aissue+created%3A2021-11-01..2022-01-31+is%3Aopen) + +## Future goals + +- actively reaching out to orgs that already talk about their InnerSource work publicly. Help them to contribute their patterns. +- hardening the patterns further, by finding 3 known instances for some of the patterns in the book (improves quality and increases trustworthiness of the patterns) +- level-up more patterns from the GitHub repo to the book. The patterns in the book seem to get more exposure to interested readers. +- trying out other ways to make the patterns easier to discover (e.g. different pattern categories; index pages at the end of the book or similar) +- try out other forms of engagement around patterns (office hours, "pattern of the month", etc) + +## Last Committer Addition + +*When was the last committer added to the project? A healthy project tends to add new committers regularly. The report should indicate the most recent date on which a committer was added.* + +- 11th of December 2020: @spier +- 24th of April 2020: @lenucksi + +## Committer Diversity + +*Cover committer diversity in your project. A healthy project should survive the departure of any single contributor or employer of contributors. What are your steps to make sure that people from all regions on the globe can participate in your project without having to be awake at midnight their local time?* + +- ??? diff --git a/meta/boardreports/2022-05.md b/meta/boardreports/2022-05.md new file mode 100644 index 000000000..8376d6f27 --- /dev/null +++ b/meta/boardreports/2022-05.md @@ -0,0 +1,63 @@ +# InnerSource Patterns WG - Report for Board Meeting 2022-05 + +## Reporting Period + +Feb 1st, 2022 - April 30st, 2022 + +## Mission + +- Discuss community InnerSource practices and dynamics, collect and document agreed upon best practices of how to do InnerSource - in the form of patterns +- Publish the most mature patterns at [patterns.innersourcecommons.org](https://patterns.innersourcecommons.org/) + +## Overview + +- Rob Tuley joined as Trusted Committer - yay! (see [innersource.flutter.com](https://innersource.flutter.com) for some of his work) +- ~8.200 (last ~6500) page views of our [patterns book](https://patterns.innersourcecommons.org/) / ~ 91 (last 72) per day +- no new patterns this quarter :( +- adding more orgs to the Known Instances of existing patterns +- some discussions about patterns are happening in #innersource-patterns +- patterns get mentioned frequently in Community Calls +- picking a **Pattern of the Month** for our Marketing Newsletters is a struggle - luckily the Marketing WG just does this themselves most of the time :). Ongoing conversations with them about how we can do marketing for the Patterns +- we need more Trusted Committers +- no office hours in EU/Americas time slots + +## Pattern Work + +- **Known Instances Collection**: low-effort activity for contributors to strengthen our patterns. in the easiest case just listing the org name under the Known Instances section of a pattern. Examples: + - 30 Day Warranty - GitHub and Microsoft + - InnerSource Portal - Banco Santander + - Document your Guiding Principles - GitHub +- **Patterns in the Wild**: Trying out an approach to extract patterns from information that is available online. + - We create an issue for each org that has published something online about their InnerSource adoption - see [examples](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues?q=is%3Aissue+label%3Apatterns-in-the-wild). + - We contact the org to talk to them about their InnerSource experiences and which patterns could be extracted. We keep this conversation in the public on the GitHub issue. + - This has lead to some great conversations already that didn't happen in Slack organically. See [DAZN example](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/392). +- new patterns (merged PRs): none +- new pattern ideas (opened issues): none + - also none of the pattern ideas from the previous quarter made into PRs, which is a bummer. +- references: + - [merged PRs](https://github.com/InnerSourceCommons/InnerSourcePatterns/pulls?q=is%3Apr+closed%3A2022-02-01..2022-04-30+is%3Amerged) + - [opened issues](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues?q=is%3Aissue+created%3A2021-11-01..2022-01-31+is%3Aopen) + +## Future Goals + +- reduce the time that PRs stay in review +- reduce the time it takes from posting a pattern idea to opening a first PR (lower the barrier for entry) +- actively reaching out to orgs that already talk about their InnerSource work publicly. Help them to contribute their patterns. => see **Patterns in the Wild** above +- hardening the patterns further, by finding 3 known instances for some of the patterns in the book (improves quality and increases trustworthiness of the patterns) => see **Known Instances Collection** above +- level-up more patterns from the GitHub repo to the book. The patterns in the book seem to get more exposure to interested readers. +- trying out other ways to make the patterns easier to discover (e.g. different pattern categories; index pages at the end of the book or similar) +- try out other forms of engagement around patterns (office hours, "pattern of the month", etc) + +## Last Committer Addition + +*When was the last committer added to the project? A healthy project tends to add new committers regularly. The report should indicate the most recent date on which a committer was added.* + +* [@robtuley](https://github.com/robtuley) (added 2022-02-15) +* [@spier](https://github.com/spier) (added 2020-12-11) +* [@lenucksi](https://github.com/lenucksi) (added 2020-04-24) + +## Committer Diversity + +*Cover committer diversity in your project. A healthy project should survive the departure of any single contributor or employer of contributors. What are your steps to make sure that people from all regions on the globe can participate in your project without having to be awake at midnight their local time?* + +- all in the EU at the moment diff --git a/meta/boardreports/2022-08.md b/meta/boardreports/2022-08.md new file mode 100644 index 000000000..0780cfd25 --- /dev/null +++ b/meta/boardreports/2022-08.md @@ -0,0 +1,76 @@ +# InnerSource Patterns WG - Report for Board Meeting 2022-08 + +#### Reporting Period + +May 1st, 2022 - July 31st, 2022 + +#### Mission + +- Discuss community InnerSource practices and dynamics, collect and document agreed upon best practices of how to do InnerSource - in the form of patterns +- Publish the most mature patterns at [patterns.innersourcecommons.org][book] +- **NEW:** Support local communities to translate the patterns intro their language + +#### Overview + +- Japanese Patterns translation + - Mature patterns were translated to [Japanese](https://patterns.innersourcecommons.org/v/jp/) and published as part of our book. yay! + - we now have the infrastructure/tooling to translate our patterns to other languages - Chinese anybody? +- [Yuki Hattori](https://github.com/yuhattor) joined as Trusted Committer - yay! (he drove the JP translation effort). He has collected an enthusiastic crowd to push the Japanese InnerSource Community forward. +- +47% page views on our [patterns book][book] + - ~12.100 page views total (last 8.200) + - ~134 per day +- 1 new pattern (Initial) +- some discussions about patterns are happening in `#innersource-patterns` +- we need more Trusted Committers +- no office hours in EU/Americas time slots + +#### Pattern Work + +- all of the new content was created by MaineC. Special thanks to her! +- new patterns (merged PRs): + - [Crossing the InnerSource Chasm](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/crossing-chasm.md) +- new pattern ideas (opened issues): + - [Contribution negotiation](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/410) + - [Move to cross-team shared ownership](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues/423) +- references: + - [merged PRs][merged-prs] + - [opened issues][opened-issues] + +#### Future Goals + +- help the Japanese InnerSource Community to channel new patterns into our repo (in English + Japanese) + +*below same as in previous report* + +- reduce the time that PRs stay in review +- reduce the time it takes from posting a pattern idea to opening a first PR (lower the barrier for entry) +- actively reaching out to orgs that already talk about their InnerSource work publicly. Help them to contribute their patterns. => see [Patterns in the Wild][2022-05 report] +- hardening the patterns further, by finding 3 known instances for some of the patterns in the book (improves quality and increases trustworthiness of the patterns) => see [Known Instances Collection][2022-05 report] +- level-up more patterns from the GitHub repo to the book (i.e. from Level 1 to Level 2). The patterns in the book seem to get more exposure. +- trying out other ways to make the patterns easier to discover (e.g. different pattern categories; index pages at the end of the book or similar) +- try out other forms of engagement around patterns (office hours, "pattern of the month", etc) + +#### Last Committer Addition[^1] + +* [@yuhattor](https://github.com/yuhattor) (added 2022-07-21) +* [@robtuley](https://github.com/robtuley) (added 2022-02-15) + +#### Committer Diversity[^2] + +- we got [@yuhattor](https://github.com/yuhattor) in Japan now :) +- could benefit from more activity in the US + +#### Challenges & Questions to the Board + +- Process for making an `innersourcecommons.org` DNS change is unclear (Daniel is working on that) +- Would be great to get a status update from the Japanese InnerSource Community in a couple of months. How are hey are doing? How we can support them? => Sebastian is offering to be the "Board contact" for them. + +[book]: https://patterns.innersourcecommons.org +[merged-prs]: https://github.com/InnerSourceCommons/InnerSourcePatterns/pulls?q=is%3Apr+closed%3A2022-05-01..2022-07-31+is%3Amerged +[opened-issues]: https://github.com/InnerSourceCommons/InnerSourcePatterns/issues?q=is%3Aissue+created%3A2022-05-01..2022-07-31+is%3Aopen+ +[2022-05 report]: https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/meta/boardreports/2022-05.md#pattern-work + +[^1]: When was the last committer added to the project? A healthy project tends to add new committers regularly. The report should indicate the most recent date on which a committer was added. +[^2]: Cover committer diversity in your project. A healthy project should survive the departure of any single contributor or employer of contributors. What are your steps to make sure that people from all regions on the globe can participate in your project without having to be awake at midnight their local time? + + diff --git a/meta/boardreports/2022-11.md b/meta/boardreports/2022-11.md new file mode 100644 index 000000000..db205ae4e --- /dev/null +++ b/meta/boardreports/2022-11.md @@ -0,0 +1,70 @@ +# InnerSource Patterns WG - Report for Board Meeting 2022-11 + +## Meta + +* Reporting Period: August 1st, 2022 - October 31st, 2022 +* [merged PRs](https://github.com/InnerSourceCommons/InnerSourcePatterns/pulls?q=is%3Apr+closed%3A2022-08-01..2022-10-31+is%3Amerged) +* [opened issues](https://github.com/InnerSourceCommons/InnerSourcePatterns/issues?q=is%3Aissue+created%3A2022-08-01..2022-10-31+is%3Aopen+) + +## Engagement + +The [patterns book] is the way InnerSource practices are captured and shared. Recent web analytics: + +* Minor traffic increase (4%) on the patterns book + * 12,627 page views total (previous report was 12,099) + * ~140 per day +* Most popular patterns are: + * InnerSource Portal (6.5% of total traffic) + * 30 Day Warranty (4.5%) + * Standard Base Documentation (4%) // Core Team (4%) +* The inclusion of a given pattern in the Marketing Newsletters don't seem to have a significant effect on the performance (readership) of those patterns. More thorough analytics could be done here to confirm this. +* The Japanese version of the site has had 700 page views since its release and 450 unique users (as of November 2022). We need more page views in the future. Currently, many GitBook contents are not listed in Japanese search results. It must be search engine optimized. + +## Changes + +Changes are contributed via the [InnerSourcePatterns] repository: + +* Sebastian Spier has been very active with various fixes and updates as usual! +* First-time contribution guide updated for hacktoberfest. +* 2 new patterns: + * [Extensions to Manage Contributions at Scale](https://github.com/InnerSourceCommons/InnerSourcePatterns/pull/444/) + * [Transitioning Contractor Code to InnerSource Model](https://github.com/InnerSourceCommons/InnerSourcePatterns/pull/377) +* Various minor updates to existing patterns. + +## Next Goals + +The overall goals of this group are: + +1. Increase number of people consuming the patterns. ("easier to discover", pattern of month, categories) +2. Increase the number and quality of patterns. + 1. Increase the number of people thinking to contribute. ("patterns in wild", "known instances") + 2. Increase probability of successful contribution. ("reduce review time", "lower barrier of entry") + 3. Optimise the existing content. (level-up more patterns, "known instances" again) + +All goals will be progressed but we are prioritising effort towards 2.iii. + +Specifically we want to get existing **Initial (L1)** patterns improved to **Structured (L2)**, so that we can publish them in the book. + +We had a [discussion](https://github.com/InnerSourceCommons/InnerSourcePatterns/pull/486#discussion_r1029921121) about this and created a short-list of those patterns (details below). + +### Shortlisted Patterns + +Here you find more detail about the possible execution of this approach. +It is more information than what the Board needs. It may however help you to understand how we are reasoning about our patterns. + +We identified these patterns as "low-hanging fruits", as they contain a **Known Instance** already, and that info is often hard to get. + +We believe we can contact the respective authors/organizations, and ask them to review the patterns against the [Structured (L2) Requirements](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/meta/contributor-handbook.md#requirements-level-2---structured). The upside for those orgs is to get their pattern (and brand) published in our book. + +We expect that with one round of review (or rather a single PR) we can get these patterns published in our book. + +* (IBM) [extensions-to-manage-contributions-at-scale.md](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/extensions-to-manage-contributions-at-scale.md) - We kept this pattern in Initial to give the community time to review/harden this pattern before it goes into the book. +* (Comcast) [release-process.md](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/release-process.md) - We kept this pattern in Initial to give the community time to review/harden this pattern before it goes into the book. +* (Flutter, Europace) [governance-levels.md](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/governance-levels.md) - Proposed by Europace (Isabel) but further improved by Rob. +* (??? Tim Yao, Georg Grütter) [contained-innersource.md](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/contained-innersource.md) - This pattern has been around for a long time. It can try to contact the two authors and see if they want to bring it over the finish line. +* (Philips) [source-code-inventory.md](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/source-code-inventory.md) +* (Philips, Verizon) [balancing-openness-and-security.md](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/balancing-openness-and-security.md) +* (GitHub) [transitioning-contractor-code-to-innersource-model.md](https://github.com/InnerSourceCommons/InnerSourcePatterns/blob/main/patterns/1-initial/transitioning-contractor-code-to-innersource-model.md) + +[patterns book]: https://patterns.innersourcecommons.org/ +[InnerSourcePatterns]: https://github.com/InnerSourceCommons/InnerSourcePatterns/ diff --git a/meta/boardreports/README.md b/meta/boardreports/README.md new file mode 100644 index 000000000..54651d5f6 --- /dev/null +++ b/meta/boardreports/README.md @@ -0,0 +1,32 @@ +# Creating a Board Report for the Patterns WG + +The Patterns Working Group is expected to submit a report to the Board of the InnerSource Commons Foundation on a quarterly basis. + +This folder contains all reports that the Patterns Working Group has created. + +More about the purpose and process is available in the [Reporting Guidelines](https://github.com/InnerSourceCommons/foundation/blob/master/projects/reporting-guidelines.md).[^1] + +## How to create a report + +To create new Board report, copy the last report in this repo (e.g. [2022-08.md](2022-08.md)) to a new file.[^2] + +The file should be named according the date of the Board meeting e.g. if the Board meeting is happening in April 2023, your file would be named `2023-04.md`. + +Then edit that file with relevant information about the reporting period for which you are creating your report. + +As guidance of what content to put into the report, take a look at the content of the previous report (which you already have in you file anyhow, as you copied it). + +If you are unsure about anything, you can always ask the other Trusted Committers. + +## Get feedback from the Working Group + +Once you have a draft of your report, create a PR in this repo. + +That allows you to get feedback from the other Trusted Committers (and potentially the wider Patterns community). + +## Submitting the report + +Once your report is ready, submit it to the Board via a PR to the [last Board meeting agenda file](https://github.com/InnerSourceCommons/foundation/blob/master/board/meeting)[^1]. + +[^1]: To access this repo, you need to be a Member of the Foundation. Please ask other Trusted Committers of the Patterns WG group for help. +[^2]: While we have a [report template](_template.md), we are not using that at the moment. diff --git a/meta/contributor-handbook.md b/meta/contributor-handbook.md index e86e1b70f..ffb60ad9d 100644 --- a/meta/contributor-handbook.md +++ b/meta/contributor-handbook.md @@ -18,42 +18,60 @@ For the first pattern you contribute, you should aim for maturity levels `1: Ini If you want to help promoting a pattern one maturity level up, we suggest to first create an issue to discuss the matter and see if someone else is working on that already. After that, you can create a pull request with the necessary changes. -To achieve a given maturity level a pattern has to satisfy the requirements for that given maturity level and lower levels. The following sections lay out the requirements per maturity level in detail. +To achieve a given maturity level, a pattern has to satisfy the requirements for that maturity level and lower levels. The following sections lay out the requirements per maturity level in detail. -### Requirements: Level 1 - Initial - -Patterns (or other documents) of level 1 are stored in the directory `/patterns/1-initial`. +### Requirements: [Level 1 - Initial][patterns-initial] - Validation requirements: - N/A - Content requirements: - - The document is readible & comprehensible for other parties (not just for the author(s)) - - The author(s) contribute the contents according to the [license](../LICENSE.txt) & are allowed to do so + - The pattern is readable & comprehensible for others (not just for the authors) + - The authors contribute the contents according to the [license](../LICENSE.txt) & are allowed to do so - Thoughts and contents by third parties are quoted / referenced explicitly + - The markdown of the pattern complies with [Check: Markdownlint](https://github.com/InnerSourceCommons/InnerSourcePatterns/actions/workflows/markdownlint.yml) -### Requirements: Level 2 - Structured +- Artifacts: + - The patterns are stored as markdown files in [/patterns/1-initial][patterns-initial]. -Patterns of level 2 are stored in the directory `/patterns/2-structured`. +### Requirements: [Level 2 - Structured][patterns-structured] - Validation requirements: - - Is validated by at least one known instance + - Is validated by at least 1 (one) known instance - Alternatively: key elements of the pattern have been validated in separate contexts and, in consequence, it is justified to believe the full solution will function - Content requirements: - - Complies with the [patterns format](pattern-template.md) - - Complies with *basic style guide*(#) - *Oops! We have not yet developed this* + - Uses the format described in the [Pattern Template](pattern-template.md) - validated in parts by [Check: Pattern Syntax Validation](https://github.com/InnerSourceCommons/InnerSourcePatterns/actions/workflows/lint-patterns.yml) + - Follows the [Pattern Style Guide](pattern-style-guide.md) + - The title of the pattern is **memorable**, **concise**, and **descriptive** of what the pattern is about. For further tips see [Naming Patterns](pattern-style-guide.md#naming-patterns). + - The pattern links to related patterns of this level or higher. + - Links from the pattern to outside resources are working and are referencing a trusted resource - whether links are working is verified by [Check: Links](https://github.com/InnerSourceCommons/InnerSourcePatterns/actions/workflows/link-checker.yml) + - The pattern is added to at least one phase of the [InnerSource Program Mind Map](../pattern-categorization/README.md). -### Requirements: Level 3 - Validated +- Artifacts: + - The patterns are stored as markdown files in [/patterns/2-structured][patterns-structured]. + - The patterns are published at [patterns.innersourcecommons.org][book] - supported by automation via [Book ToC Generation][book-toc-automation] -Patterns of level 3 are stored in the directory `/patterns/3-validated`. +### Requirements: [Level 3 - Validated][patterns-validated] - Validation requirements: - - Is validated by at least three known instances - - Considers all known instances to the best of working group members' knowledge + - Is validated by at least 3 (three) known instances + - Considers all known instances to the best knowledge of the working group - Community agreement (via lazy consensus of trusted committers) on correctness of contents - Content requirements: - - Uses & has no conflicts with working group terminology (defined by glossary / implicit usage) - *Oops! We have not yet developed this.* - - Fits & has no conflicts with existing patterns (of this maturity level or higher) - - Thorough review by at least two trusted committers + - Provides a visual/sketch that helps to illustrate the problem and/or the solution of the pattern. The visual also helps to make the pattern more memorable. Visuals are stored in [assets/img](../assets/img/). + - Uses & has no conflicts with working group terminology (defined by [Glossary](glossary.md) / implicit usage) + - Fits & has no conflicts with existing patterns (of this maturity level) + - Thorough review by at least two [trusted committers](../TRUSTED-COMMITTERS.md) + - Spell Checking passes - *Oops! We have not yet developed this* + +- Artifacts: + - The patterns are stored as markdown files in [/patterns/3-validated][patterns-validated]. + - The patterns are published at [patterns.innersourcecommons.org][book] - supported by automation via [Book ToC Generation][book-toc-automation] + +[patterns-initial]: ../patterns/1-initial/ +[patterns-structured]: ../patterns/2-structured/ +[patterns-validated]: ../patterns/3-validated/ +[book]: https://patterns.innersourcecommons.org +[book-toc-automation]: https://github.com/InnerSourceCommons/InnerSourcePatterns/actions/workflows/book.yml diff --git a/meta/glossary.md b/meta/glossary.md new file mode 100644 index 000000000..a46cb7499 --- /dev/null +++ b/meta/glossary.md @@ -0,0 +1,10 @@ +# Glossary + +This glossary defines essential terms that are commonly used when writing new patterns. It focuses on key terms and resolves ambiguities where necessary. + +Through this the glossary helps members of the Patterns Working Group to use consistent language when writing and reviewing patterns. + +- **organization** - An umbrella for multiple legal entities. (synonyms: group, enterprise) (e.g. Lufthansa) +- **legal entity** - An entity that has its own legal rights and obligations (synonyms: company, subsidiary) (e.g. Lufthansa Systems GmbH, Lufthansa Industry Solutions TS GmbH, ...) + +*Note that his glossary is far from complete. If you see terms that are used frequently in our patterns and should be defined in this glossary, please add them.* diff --git a/meta/innersource-spelling.md b/meta/innersource-spelling.md index 01c5fc3fc..0ace9a652 100644 --- a/meta/innersource-spelling.md +++ b/meta/innersource-spelling.md @@ -2,7 +2,7 @@ We recommend the spelling **InnerSource**. -We encourage you to use the word as a proper noun (like “We use InnerSource in that repo”) wherever possible. We discourage the use of verb forms of the word (like “We’re inner-sourcing that repo”). +We encourage you to use the word as a proper noun (like “We use InnerSource in that repo.”) wherever possible. We discourage the use of verb forms of the word (like “We’re InnerSourcing that repo”). ## Full story - Why we care about the spelling @@ -30,14 +30,15 @@ We recommend not to turn the term into a verb, but rather using it as a noun or Recommended use: -“We use InnerSource in that repo” -or -“We use InnerSource methods in that repo” +> “We use InnerSource in that repo.”
+“We use InnerSource methods in that repo.”
+“We follow InnerSource development methods in that repo.”
+“We published the repository as InnerSource.” Not so good: -“We’re InnerSourcing that repo” +> “We’re InnerSourcing that repo.” [opengl_1200]: https://web.archive.org/web/20180411080939/http://archive.oreilly.com/pub/a/oreilly/ask_tim/2000/opengl_1200.html -[foreword_AdoptingInnerSource]: https://innersourcecommons.org/assets/files/AdoptingInnerSource.pdf +[foreword_AdoptingInnerSource]: https://innersourcecommons.org/documents/books/AdoptingInnerSource.pdf [no-open-source-trademark]: https://opensource.org/pressreleases/certified-open-source.php diff --git a/meta/pattern-style-guide.md b/meta/pattern-style-guide.md new file mode 100644 index 000000000..26a02e01b --- /dev/null +++ b/meta/pattern-style-guide.md @@ -0,0 +1,35 @@ +# Pattern Style Guide + +The patterns have been written by various different people over many years. So naturally they don't read like "written by the same person". + +However by following a couple of conventions when writing patterns we try to create at least some style consistency. + +## Naming Patterns + +Finding a good name for a pattern isn't easy. We want the pattern name to be **memorable**, **concise**, and **descriptive** of what the pattern is about. + +Some suggestions on how to achieve this: + +- memorable: Well that might be the hardest one to get right (and to agree on). We hope that the sum of all tips here helps you find a memorable name for your pattern. +- concise: Use 5 words or less. Many of the patterns published in our book actually have 2 or 3-word titles. +- descriptive: We suggest to use either the **problem** that the pattern solves, or the **solution** as inspiration for the pattern name. +- don't use "InnerSource" in the name - all of these patterns are about InnerSource, so consider if using the term InnerSource makes it easier for potential readers to understand what this pattern is about. Note that there can also be good reasons to use InnerSource in the name as in "InnerSource License" for example. +- don't use special characters in the title. stick to `[a-zA-Z]` :) + +And some technicalities: + +- We use titlecase for Patterns e.g. "Document your Guiding Principles" +- The name of your markdown file should be the same as the title, and only use lowercase and hyphens (e.g. `document-your-guiding-principles.md`). +- This file name will also show up as the last part of the URL when your pattern is published to our online book e.g. `https://patterns.innersourcecommons.org/p/document-your-guiding-principles`. + +## InnerSource Spelling + +We recommend the spelling **InnerSource**. + +We encourage you to use the word as a proper noun (like “We use InnerSource in that repo”) wherever possible. We discourage the use of verb forms of the word (like “We’re inner-sourcing that repo”). + +For the full story behind this see [InnerSource Spelling](innersource-spelling.md). + +## Glossary + +See [Glossary](glossary.md). diff --git a/pattern-categorization/README.md b/pattern-categorization/README.md index 7df70eb41..1dbf14db9 100644 --- a/pattern-categorization/README.md +++ b/pattern-categorization/README.md @@ -10,13 +10,19 @@ This first categorization effort uses a mind map to categorize patterns based on In the mind map you will see patterns categorized from left to right in increasing levels of detail. -The logic for these levels is (from left to right): +```mermaid +graph LR + L0(L0 InnerSource Program) --> L1(L1 Phase) --> L2(L2 Problem Category) + L2(L2 Problem Category) --> L3(L3 Specific Problem) --> L4("L4 Pattern (Solution)") +```` -- level 0: the InnerSource program itself (as the root) -- level 1: phase of an InnerSource Program (begin/adopt/grow/scale) -- level 2: problem category -- level 3: specific problem occurring in an InnerSource context -- level 4: pattern (solution to the problem) +The logic for these levels is: + +- L0: the InnerSource program itself (as the root) +- L1: phase of an InnerSource Program (begin/adopt/grow/scale) +- L2: problem category +- L3: specific problem occurring in an InnerSource context +- L4: pattern (solution to the problem) ## Adding a Pattern to the Mind Map @@ -26,9 +32,11 @@ Then create a PR with your changes. This triggers an [action](https://github.com To test your changes locally, you can also generate the mind map yourself like this: +We are using `node 12.x` at the moment. + ``` npm install -g markmap-cli -markmap innersource-program-mind-map.md +npx markmap --no-toolbar innersource-program-mind-map.md ``` ## Future Ideas for Categorization diff --git a/pattern-categorization/innersource-program-mind-map.html b/pattern-categorization/innersource-program-mind-map.html index 27c205b95..acd8b0a10 100644 --- a/pattern-categorization/innersource-program-mind-map.html +++ b/pattern-categorization/innersource-program-mind-map.html @@ -20,11 +20,9 @@ - + diff --git a/pattern-categorization/innersource-program-mind-map.md b/pattern-categorization/innersource-program-mind-map.md index f3e9f3b5e..008bd6adf 100644 --- a/pattern-categorization/innersource-program-mind-map.md +++ b/pattern-categorization/innersource-program-mind-map.md @@ -121,3 +121,9 @@ #### Lack of open source knowledge ##### [Document your Guiding Principles](https://patterns.innersourcecommons.org/p/document-your-guiding-principles) + +### Technical Challenges + +#### Increasing maintenance overhead + +##### [Extensions for Sustainable Growth](https://patterns.innersourcecommons.org/p/extensions-for-sustainable-growth) diff --git a/pattern-categorization/innersource-program-mind-map.png b/pattern-categorization/innersource-program-mind-map.png index fa7a6228e..cd2c26c55 100644 Binary files a/pattern-categorization/innersource-program-mind-map.png and b/pattern-categorization/innersource-program-mind-map.png differ diff --git a/pattern-categorization/package-lock.json b/pattern-categorization/package-lock.json index e49115467..02b9a6137 100644 --- a/pattern-categorization/package-lock.json +++ b/pattern-categorization/package-lock.json @@ -1,21 +1,3136 @@ { "name": "pattern-mindmap-generator", "version": "0.0.1", - "lockfileVersion": 1, + "lockfileVersion": 2, "requires": true, + "packages": { + "": { + "name": "pattern-mindmap-generator", + "version": "0.0.1", + "license": "ISC", + "dependencies": { + "markmap-cli": ">=0.13.3", + "optipng-bin": "^9.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@sindresorhus/is": { + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-1.1.2.tgz", + "integrity": "sha512-XIB2XbzHTN6ieIjfIMV9hlVcfPU26s2vafYWQcZHWXHOxiaRZYEDKEwdl129Zyg50+foYV2jCgtrqSA6qNuNSA==", + "dependencies": { + "defer-to-connect": "^1.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/archive-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", + "dependencies": { + "file-type": "^4.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/archive-type/node_modules/file-type": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/autolinker": { + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.15.0.tgz", + "integrity": "sha512-N/5Dk5AZnqL9k6kkHdFIGLm/0/rRuSnJwqYYhLCJjU7ZtiaJwCBzNTvjzy1zzJADngv/wvtHYcrPHytPnASeFA==", + "dependencies": { + "tslib": "^2.3.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/bin-build": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bin-build/-/bin-build-3.0.0.tgz", + "integrity": "sha512-jcUOof71/TNAI2uM5uoUaDq2ePcVBQ3R/qhxAz1rX7UfvduAL/RXD3jXzvn8cVcDJdGVkiR1shal3OH0ImpuhA==", + "dependencies": { + "decompress": "^4.0.0", + "download": "^6.2.2", + "execa": "^0.7.0", + "p-map-series": "^1.0.0", + "tempfile": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-check": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-check/-/bin-check-4.1.0.tgz", + "integrity": "sha512-b6weQyEUKsDGFlACWSIOfveEnImkJyK/FGW6FAG42loyoquvjdtOIqO6yBFzHyqyVVhNgNkQxxx09SFLK28YnA==", + "dependencies": { + "execa": "^0.7.0", + "executable": "^4.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bin-version/-/bin-version-3.1.0.tgz", + "integrity": "sha512-Mkfm4iE1VFt4xd4vH+gx+0/71esbfus2LsnCGe8Pi4mndSPyT+NGES/Eg99jx8/lUGWfu3z2yuB/bt5UB+iVbQ==", + "dependencies": { + "execa": "^1.0.0", + "find-versions": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version-check": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/bin-version-check/-/bin-version-check-4.0.0.tgz", + "integrity": "sha512-sR631OrhC+1f8Cvs8WyVWOA33Y8tgwjETNPyyD/myRBXLkfS/vl74FmH/lFcRl9KY3zwGh7jFhvyk9vV3/3ilQ==", + "dependencies": { + "bin-version": "^3.0.0", + "semver": "^5.6.0", + "semver-truncate": "^1.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version-check/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/bin-version/node_modules/cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "dependencies": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + }, + "engines": { + "node": ">=4.8" + } + }, + "node_modules/bin-version/node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-version/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/bin-wrapper": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bin-wrapper/-/bin-wrapper-4.1.0.tgz", + "integrity": "sha512-hfRmo7hWIXPkbpi0ZltboCMVrU+0ClXR/JgbCKKjlDjQf6igXa7OwdqNcFWQZPZTgiY7ZpzE3+LjjkLiTN2T7Q==", + "dependencies": { + "bin-check": "^4.1.0", + "bin-version-check": "^4.0.0", + "download": "^7.1.0", + "import-lazy": "^3.1.0", + "os-filter-obj": "^2.0.0", + "pify": "^4.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", + "dependencies": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + } + }, + "node_modules/bin-wrapper/node_modules/download": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", + "integrity": "sha512-xqnBTVd/E+GxJVrX5/eUJiLYjCGPwMpdL+jGhGU57BvtcA7wwhtHVbXBeUk51kOpW3S7Jn3BQbN9Q1R1Km2qDQ==", + "dependencies": { + "archive-type": "^4.0.0", + "caw": "^2.0.1", + "content-disposition": "^0.5.2", + "decompress": "^4.2.0", + "ext-name": "^5.0.0", + "file-type": "^8.1.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^8.3.1", + "make-dir": "^1.2.0", + "p-event": "^2.1.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/download/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/file-type": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-8.1.0.tgz", + "integrity": "sha512-qyQ0pzAy78gVoJsmYeNgl8uH8yKhr1lVhW7JbzJmnlRi0I4R2eEDEJZVKG8agpDnLpacwNbDhLNG/LMdxHD2YQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/got": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/got/-/got-8.3.2.tgz", + "integrity": "sha512-qjUJ5U/hawxosMryILofZCkm3C84PLJS/0grRIpjAwu+Lkxxj5cxeCU25BG0/3mDSpXKTyZr8oh8wIgLaH0QCw==", + "dependencies": { + "@sindresorhus/is": "^0.7.0", + "cacheable-request": "^2.1.1", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "into-stream": "^3.1.0", + "is-retry-allowed": "^1.1.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "mimic-response": "^1.0.0", + "p-cancelable": "^0.4.0", + "p-timeout": "^2.0.1", + "pify": "^3.0.0", + "safe-buffer": "^5.1.1", + "timed-out": "^4.0.1", + "url-parse-lax": "^3.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/got/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "node_modules/bin-wrapper/node_modules/import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/bin-wrapper/node_modules/lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/bin-wrapper/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "dependencies": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/p-cancelable": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", + "integrity": "sha512-HNa1A8LvB1kie7cERyy21VNeHb2CWJJYqyyC2o3klWFfMGlFmWv2Z7sFgZH8ZiaYL95ydToKTFVXgMV/Os0bBQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/p-event": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-2.3.1.tgz", + "integrity": "sha512-NQCqOFhbpVTMX4qMe8PF8lbGtzZ+LCiN7pcNrb/413Na7+TRoe1xkKUzuWa/YEJdGQ0FvKtj35EEbDoVPO2kbA==", + "dependencies": { + "p-timeout": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/bin-wrapper/node_modules/p-timeout": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-2.0.1.tgz", + "integrity": "sha512-88em58dDVB/KzPEx1X0N3LwFfYZPyDc4B6eF38M1rk9VTZMbxXXgjugz8mmwpS9Ox4BDZ+t6t3QP5+/gazweIA==", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/bin-wrapper/node_modules/sort-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", + "integrity": "sha512-pvcNpa0UU69UT341rO6AYy4FVAIkUHuZXRIWbq+zHnsVcRzDDjIAhGuuYoi0d//cwIwtt4pkpKycWEfjdV+vww==", + "dependencies": { + "readable-stream": "^2.3.5", + "safe-buffer": "^5.1.1" + } + }, + "node_modules/boxen": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", + "dependencies": { + "ansi-align": "^3.0.0", + "camelcase": "^6.2.0", + "chalk": "^4.1.0", + "cli-boxes": "^2.2.1", + "string-width": "^4.2.2", + "type-fest": "^0.20.2", + "widest-line": "^3.1.0", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-alloc": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/buffer-alloc/-/buffer-alloc-1.2.0.tgz", + "integrity": "sha512-CFsHQgjtW1UChdXgbyJGtnm+O/uLQeZdtbDo8mfUgYXCHSM1wgrVxXm6bSyrUuErEb+4sYVGCzASBRot7zyrow==", + "dependencies": { + "buffer-alloc-unsafe": "^1.1.0", + "buffer-fill": "^1.0.0" + } + }, + "node_modules/buffer-alloc-unsafe": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/buffer-alloc-unsafe/-/buffer-alloc-unsafe-1.1.0.tgz", + "integrity": "sha512-TEM2iMIEQdJ2yjPJoSIsldnleVaAk1oW3DBVUykyOLsEsFmEc9kn+SFFPz+gl54KQNxlDnAwCXosOS9Okx2xAg==" + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "engines": { + "node": "*" + } + }, + "node_modules/buffer-fill": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" + }, + "node_modules/cache-content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-content-type/-/cache-content-type-1.0.1.tgz", + "integrity": "sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==", + "dependencies": { + "mime-types": "^2.1.18", + "ylru": "^1.2.0" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/cacheable-request": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "dependencies": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cacheable-request/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cacheable-request/node_modules/lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caw": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/caw/-/caw-2.0.1.tgz", + "integrity": "sha512-Cg8/ZSBEa8ZVY9HspcGUYaK63d/bN7rqS3CYCzEGUxuYv6UlmcjzDUz2fCFFHyTvUW5Pk0I+3hkA3iXlIj6guA==", + "dependencies": { + "get-proxy": "^2.0.0", + "isurl": "^1.0.0-alpha5", + "tunnel-agent": "^0.6.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/ci-info": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-2.0.0.tgz", + "integrity": "sha512-5tK7EtrZ0N+OLFMthtqOj4fI2Jeb88C4CAZPu25LDVUgXJ0A3Js4PMGqrn0JU1W0Mh1/Z8wZzYPxqUrXeBboCQ==" + }, + "node_modules/cli-boxes": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-2.2.1.tgz", + "integrity": "sha512-y4coMcylgSCdVinjiDBuR8PCC2bLjyGTwEmPb9NHR/QaNU6EUOXcTY/s6VjGMD6ENSEaeQYHCY0GNGS5jfMwPw==", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/clone-response": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", + "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", + "dependencies": { + "mimic-response": "^1.0.0" + } + }, + "node_modules/co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "engines": { + "node": ">= 10" + } + }, + "node_modules/config-chain": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.13.tgz", + "integrity": "sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/config-chain/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/configstore": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", + "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", + "dependencies": { + "dot-prop": "^5.2.0", + "graceful-fs": "^4.1.2", + "make-dir": "^3.0.0", + "unique-string": "^2.0.0", + "write-file-atomic": "^3.0.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookies": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.8.0.tgz", + "integrity": "sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==", + "dependencies": { + "depd": "~2.0.0", + "keygrip": "~1.1.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" + }, + "node_modules/cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "dependencies": { + "lru-cache": "^4.0.1", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "node_modules/cross-spawn/node_modules/lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "dependencies": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "node_modules/cross-spawn/node_modules/yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "node_modules/crypto-random-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", + "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/decompress": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/decompress/-/decompress-4.2.1.tgz", + "integrity": "sha512-e48kc2IjU+2Zw8cTb6VZcJQ3lgVbS4uuB1TfCHbiZIP/haNXm+SVyhu+87jts5/3ROpd82GSVCoNs/z8l4ZOaQ==", + "dependencies": { + "decompress-tar": "^4.0.0", + "decompress-tarbz2": "^4.0.0", + "decompress-targz": "^4.0.0", + "decompress-unzip": "^4.0.1", + "graceful-fs": "^4.1.10", + "make-dir": "^1.0.0", + "pify": "^2.3.0", + "strip-dirs": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-response": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-3.3.0.tgz", + "integrity": "sha1-gKTdMjdIOEv6JICDYirt7Jgq3/M=", + "dependencies": { + "mimic-response": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tar": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tar/-/decompress-tar-4.1.1.tgz", + "integrity": "sha512-JdJMaCrGpB5fESVyxwpCx4Jdj2AagLmv3y58Qy4GE6HMVjWz1FeVQk1Ct4Kye7PftcdOo/7U7UKzYBJgqnGeUQ==", + "dependencies": { + "file-type": "^5.2.0", + "is-stream": "^1.1.0", + "tar-stream": "^1.5.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-tarbz2/-/decompress-tarbz2-4.1.1.tgz", + "integrity": "sha512-s88xLzf1r81ICXLAVQVzaN6ZmX4A6U4z2nMbOwobxkLoIIfjVMBg7TeguTUXkKeXni795B6y5rnvDw7rxhAq9A==", + "dependencies": { + "decompress-tar": "^4.1.0", + "file-type": "^6.1.0", + "is-stream": "^1.1.0", + "seek-bzip": "^1.0.5", + "unbzip2-stream": "^1.0.9" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-tarbz2/node_modules/file-type": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-6.2.0.tgz", + "integrity": "sha512-YPcTBDV+2Tm0VqjybVd32MHdlEGAtuxS3VAYsumFokDSMG+ROT5wawGlnHDoz7bfMcMDt9hxuXvXwoKUx2fkOg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-targz": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/decompress-targz/-/decompress-targz-4.1.1.tgz", + "integrity": "sha512-4z81Znfr6chWnRDNfFNqLwPvm4db3WuZkqV+UgXQzSngG3CEKdBkw5jrv3axjjL96glyiiKjsxJG3X6WBZwX3w==", + "dependencies": { + "decompress-tar": "^4.1.1", + "file-type": "^5.2.0", + "is-stream": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", + "dependencies": { + "file-type": "^3.8.0", + "get-stream": "^2.2.0", + "pify": "^2.3.0", + "yauzl": "^2.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress-unzip/node_modules/file-type": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "dependencies": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress-unzip/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decompress/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/make-dir/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/decompress/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/deep-equal": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", + "integrity": "sha1-9dJgKStmDghO/0zbyfCK0yR0SLU=" + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/defer-to-connect": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-1.1.3.tgz", + "integrity": "sha512-0ISdNousHvZT2EiFlZeZAHBUvSxmKswVCEf8hW7KWgG4a8MVEu/3Vb6uWYozkjylyCxe0JBIiRB1jV45S70WVQ==" + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/download": { + "version": "6.2.5", + "resolved": "https://registry.npmjs.org/download/-/download-6.2.5.tgz", + "integrity": "sha512-DpO9K1sXAST8Cpzb7kmEhogJxymyVUd5qz/vCOSyvwtp2Klj2XcDt5YUuasgxka44SxF0q5RriKIwJmQHG2AuA==", + "dependencies": { + "caw": "^2.0.0", + "content-disposition": "^0.5.2", + "decompress": "^4.0.0", + "ext-name": "^5.0.0", + "file-type": "5.2.0", + "filenamify": "^2.0.0", + "get-stream": "^3.0.0", + "got": "^7.0.0", + "make-dir": "^1.0.0", + "p-event": "^1.0.0", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "dependencies": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "dependencies": { + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/download/node_modules/prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/download/node_modules/url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dependencies": { + "prepend-http": "^1.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/escape-goat": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", + "integrity": "sha512-8/uIhbG12Csjy2JEW7D9pHbreaVaS/OpN3ycnyvElTdwM5n6GY6W6e2IPemfvGZeUMqZ9A/3GqIZMgKnBhAw/Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", + "dependencies": { + "cross-spawn": "^5.0.1", + "get-stream": "^3.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "engines": { + "node": ">=4" + } + }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-list": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/ext-list/-/ext-list-2.2.2.tgz", + "integrity": "sha512-u+SQgsubraE6zItfVA0tBuCBhfU9ogSRnsvygI7wht9TS510oLkBRXBsqopeUG/GBOIQyKZO9wjTqIu/sf5zFA==", + "dependencies": { + "mime-db": "^1.28.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/ext-name": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ext-name/-/ext-name-5.0.0.tgz", + "integrity": "sha512-yblEwXAbGv1VQDmow7s38W77hzAgJAO50ztBLMcUyUBfxv1HC+LGwtiEN+Co6LtlqT/5uwVOxsD4TNIilWhwdQ==", + "dependencies": { + "ext-list": "^2.0.0", + "sort-keys-length": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/file-type": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/filename-reserved-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/filenamify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-2.1.0.tgz", + "integrity": "sha512-ICw7NTT6RsDp2rnYKVd8Fu4cr6ITzGy3+u4vUujPkabyaz+03F24NWEX7fs5fp+kBonlaqPH8fAO2NM+SXt/JA==", + "dependencies": { + "filename-reserved-regex": "^2.0.0", + "strip-outer": "^1.0.0", + "trim-repeated": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-versions": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", + "integrity": "sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==", + "dependencies": { + "semver-regex": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", + "dependencies": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "node_modules/fs-constants": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-proxy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", + "integrity": "sha512-zmZIaQTWnNQb4R4fJUEp/FC51eZsc6EkErspy3xtIYStaq8EB/hDIWipxsal+E8rz0qD7f2sL/NA9Xee4RInJw==", + "dependencies": { + "npm-conf": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/got": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "dependencies": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", + "duplexer3": "^0.1.4", + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbol-support-x": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/has-symbol-support-x/-/has-symbol-support-x-1.4.2.tgz", + "integrity": "sha512-3ToOva++HaW+eCpgqZrCfN51IPB+7bJNVT6CUATzueB5Heb8o6Nam0V3HG5dlDvZU1Gn5QLcbahiKw/XVk5JJw==", + "engines": { + "node": "*" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-to-string-tag-x": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/has-to-string-tag-x/-/has-to-string-tag-x-1.4.1.tgz", + "integrity": "sha512-vdbKfmw+3LoOYVr+mtxHaX5a96+0f3DljYd8JOqvOLsf5mw2Otda2qCDT9qRqLAhrjyQ0h7ual5nOiASpsGNFw==", + "dependencies": { + "has-symbol-support-x": "^1.4.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", + "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/http-assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", + "integrity": "sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==", + "dependencies": { + "deep-equal": "~1.0.1", + "http-errors": "~1.8.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/import-lazy": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=", + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/into-stream": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/into-stream/-/into-stream-3.1.0.tgz", + "integrity": "sha1-lvsKk2wSur1v8XUqF9BWFqvQlMY=", + "dependencies": { + "from2": "^2.1.1", + "p-is-promise": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", + "integrity": "sha512-YfJT7rkpQB0updsdHLGWrvhBJfcfzNNawYDNIyQXJz0IViGf75O8EBPKSdvw2rF+LGCsX4FZ8tcr3b19LcZq4w==", + "dependencies": { + "ci-info": "^2.0.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-natural-number": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-natural-number/-/is-natural-number-4.0.1.tgz", + "integrity": "sha1-q5124dtM7VHjXeDHLr7PCfc0zeg=" + }, + "node_modules/is-npm": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-5.0.0.tgz", + "integrity": "sha512-WW/rQLOazUq+ST/bCAVBp/2oMERWLsR7OrKyt052dNDk4DHcDE0/7QSXITlmi+VBcV13DfIbysG3tZJm5RfdBA==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.2.tgz", + "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-retry-allowed": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.2.0.tgz", + "integrity": "sha512-RUbUeKwvm3XG2VYamhJL1xFktgjvPzL0Hq8C+6yrWIswDy3BIXGqCxhxkc30N9jqK311gVU137K8Ei55/zVJRg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-yarn-global/-/is-yarn-global-0.3.0.tgz", + "integrity": "sha512-VjSeb/lHmkoyd8ryPVIKvOCn4D1koMqY+vqyjjUfc3xyKtP4dYOxM44sZrnqQSzSds3xyOrUTLTC9LVCVgLngw==" + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "node_modules/isurl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isurl/-/isurl-1.0.0.tgz", + "integrity": "sha512-1P/yWsxPlDtn7QeRD+ULKQPaIaN6yF368GZ2vDfv0AL0NwpStafjWCDDdn0k8wgFMWpVAqG7oJhxHnlud42i9w==", + "dependencies": { + "has-to-string-tag-x": "^1.2.0", + "is-object": "^1.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", + "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" + }, + "node_modules/katex": { + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.6.tgz", + "integrity": "sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==", + "funding": [ + "https://opencollective.com/katex", + "https://github.com/sponsors/katex" + ], + "dependencies": { + "commander": "^8.0.0" + }, + "bin": { + "katex": "cli.js" + } + }, + "node_modules/katex/node_modules/commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", + "engines": { + "node": ">= 12" + } + }, + "node_modules/keygrip": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/keygrip/-/keygrip-1.1.0.tgz", + "integrity": "sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==", + "dependencies": { + "tsscmp": "1.0.6" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/keyv": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", + "dependencies": { + "json-buffer": "3.0.0" + } + }, + "node_modules/koa": { + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.4.tgz", + "integrity": "sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==", + "dependencies": { + "accepts": "^1.3.5", + "cache-content-type": "^1.0.0", + "content-disposition": "~0.5.2", + "content-type": "^1.0.4", + "cookies": "~0.8.0", + "debug": "^4.3.2", + "delegates": "^1.0.0", + "depd": "^2.0.0", + "destroy": "^1.0.4", + "encodeurl": "^1.0.2", + "escape-html": "^1.0.3", + "fresh": "~0.5.2", + "http-assert": "^1.3.0", + "http-errors": "^1.6.3", + "is-generator-function": "^1.0.7", + "koa-compose": "^4.1.0", + "koa-convert": "^2.0.0", + "on-finished": "^2.3.0", + "only": "~0.0.2", + "parseurl": "^1.3.2", + "statuses": "^1.5.0", + "type-is": "^1.6.16", + "vary": "^1.1.2" + }, + "engines": { + "node": "^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4" + } + }, + "node_modules/koa-compose": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-4.1.0.tgz", + "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" + }, + "node_modules/koa-convert": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", + "dependencies": { + "co": "^4.6.0", + "koa-compose": "^4.1.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/latest-version": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", + "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", + "dependencies": { + "package-json": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lowercase-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", + "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/markmap-cli": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/markmap-cli/-/markmap-cli-0.13.3.tgz", + "integrity": "sha512-+HhtOoHW6JddFqESLGElaapRWX8IT9QiBO9BcSXX9KOomzaXxUikThwDwxy6loBuCusrYRq58G6rVrJw4W5o9Q==", + "dependencies": { + "@babel/runtime": "^7.13.10", + "chokidar": "^3.5.1", + "commander": "^7.1.0", + "koa": "^2.13.1", + "markmap-lib": "^0.13.3", + "open": "^8.0.3", + "update-notifier": "^5.1.0" + }, + "bin": { + "markmap": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/markmap-common": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/markmap-common/-/markmap-common-0.13.3.tgz", + "integrity": "sha512-bKdEUgeLmloyJXrPErg+LdD7HppqRm836TQzhIWN1Wm5THOG8POouAdnLh14X6JCe1ofFbEMhPMZFs9unRLhtQ==", + "dependencies": { + "@babel/runtime": "^7.12.1" + } + }, + "node_modules/markmap-lib": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/markmap-lib/-/markmap-lib-0.13.3.tgz", + "integrity": "sha512-4ldQfldiEZddMOUoEJnfVpekiJas+mG9D9oAUpDM+9Ypg+x3bThnjjXlx8isfXsSjRV6caZnn4+I9lAa2i5Wfg==", + "dependencies": { + "@babel/runtime": "^7.16.3", + "js-yaml": "^4.1.0", + "katex": "^0.15.1", + "markmap-common": "^0.13.3", + "prismjs": "^1.25.0", + "remarkable": "^2.0.1", + "remarkable-katex": "^1.1.8" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-response": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/npm-conf": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/npm-conf/-/npm-conf-1.1.3.tgz", + "integrity": "sha512-Yic4bZHJOt9RCFbRP3GgpqhScOY4HH3V2P8yBj6CeYq118Qr+BLXqT2JvpJ00mryLESpgOxf5XlFv4ZjXxLScw==", + "dependencies": { + "config-chain": "^1.1.11", + "pify": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-conf/node_modules/pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=", + "engines": { + "node": ">=4" + } + }, + "node_modules/npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dependencies": { + "path-key": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/only": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/only/-/only-0.0.2.tgz", + "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/optipng-bin": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-9.0.0.tgz", + "integrity": "sha512-uDcmcNK4MRSM5ezLThUPI7fc9ZxlQMqnxhWxIc7foCcUZZ2LvzbcJwwVEsU78tC3t9B68dwE4y/m6at10Z93UA==", + "hasInstallScript": true, + "dependencies": { + "bin-build": "^3.0.0", + "bin-wrapper": "^4.0.0" + }, + "bin": { + "optipng": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/os-filter-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/os-filter-obj/-/os-filter-obj-2.0.0.tgz", + "integrity": "sha512-uksVLsqG3pVdzzPvmAHpBK0wKxYItuzZr7SziusRPoz67tGV8rL1szZ6IdeUrbqLjGDwApBtN29eEE3IqGHOjg==", + "dependencies": { + "arch": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-cancelable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/p-event": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-event/-/p-event-1.3.0.tgz", + "integrity": "sha1-jmtPT2XHK8W2/ii3XtqHT5akoIU=", + "dependencies": { + "p-timeout": "^1.1.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-is-promise": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz", + "integrity": "sha1-nJRWmJ6fZYgBewQ01WCXZ1w9oF4=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-map-series": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-map-series/-/p-map-series-1.0.0.tgz", + "integrity": "sha1-v5j+V1cFZYqeE1G++4WuTB8Hvco=", + "dependencies": { + "p-reduce": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/p-reduce": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-reduce/-/p-reduce-1.0.0.tgz", + "integrity": "sha1-GMKw3ZNqRpClKfgjH1ig/bakffo=", + "engines": { + "node": ">=4" + } + }, + "node_modules/p-timeout": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/p-timeout/-/p-timeout-1.2.1.tgz", + "integrity": "sha1-XrOzU7f86Z8QGhA4iAuwVOu+o4Y=", + "dependencies": { + "p-finally": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/package-json": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-6.5.0.tgz", + "integrity": "sha512-k3bdm2n25tkyxcjSKzB5x8kfVxlMdgsbPr0GkZcwHsLpba6cBjqCt1KlcChKEvxHIcTB1FVMuwoijZ26xex5MQ==", + "dependencies": { + "got": "^9.6.0", + "registry-auth-token": "^4.0.0", + "registry-url": "^5.0.0", + "semver": "^6.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/package-json/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "engines": { + "node": ">=4" + } + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "engines": { + "node": ">=6" + } + }, + "node_modules/pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "dependencies": { + "pinkie": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/prepend-http": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=", + "engines": { + "node": ">=4" + } + }, + "node_modules/prismjs": { + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "node_modules/proto-list": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz", + "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=" + }, + "node_modules/pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/pupa": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/pupa/-/pupa-2.1.1.tgz", + "integrity": "sha512-l1jNAspIBSFqbT+y+5FosojNpVpF94nlI+wDUpqP9enwOTfHx9f0gh5nB96vl+6yTpsJsypeNrwfzPrKuHB41A==", + "dependencies": { + "escape-goat": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/query-string": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-5.1.1.tgz", + "integrity": "sha512-gjWOsm2SoGlgLEdAGt7a6slVOk9mGiXmPFMqrEhLQ68rhQuBnpfs3+EmlvqKyxnCo9/PPlF+9MtY02S1aFg+Jw==", + "dependencies": { + "decode-uri-component": "^0.2.0", + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/readable-stream/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==" + }, + "node_modules/registry-auth-token": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-4.2.1.tgz", + "integrity": "sha512-6gkSb4U6aWJB4SF2ZvLb76yCBjcvufXBqvvEx1HbmKPkutswjW1xNVRY0+daljIYRbogN7O0etYSlbiaEQyMyw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/registry-url": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-5.1.0.tgz", + "integrity": "sha512-8acYXXTI0AkQv6RAOjE3vOaIXZkT9wo4LOFbBKYQEEnnMNBpKqdUrI6S4NT0KPIo/WVvJ5tE/X5LF/TQUf0ekw==", + "dependencies": { + "rc": "^1.2.8" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/remarkable": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/remarkable/-/remarkable-2.0.1.tgz", + "integrity": "sha512-YJyMcOH5lrR+kZdmB0aJJ4+93bEojRZ1HGDn9Eagu6ibg7aVZhc3OWbbShRid+Q5eAfsEqWxpe+g5W5nYNfNiA==", + "dependencies": { + "argparse": "^1.0.10", + "autolinker": "^3.11.0" + }, + "bin": { + "remarkable": "bin/remarkable.js" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/remarkable-katex": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remarkable-katex/-/remarkable-katex-1.2.1.tgz", + "integrity": "sha512-Y1VquJBZnaVsfsVcKW2hmjT+pDL7mp8l5WAVlvuvViltrdok2m1AIKmJv8SsH+mBY84PoMw67t3kTWw1dIm8+g==" + }, + "node_modules/remarkable/node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/responselike": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-1.0.2.tgz", + "integrity": "sha1-kYcg7ztjHFZCvgaPFa3lpG9Loec=", + "dependencies": { + "lowercase-keys": "^1.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/seek-bzip": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/seek-bzip/-/seek-bzip-1.0.6.tgz", + "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", + "dependencies": { + "commander": "^2.8.1" + }, + "bin": { + "seek-bunzip": "bin/seek-bunzip", + "seek-table": "bin/seek-bzip-table" + } + }, + "node_modules/seek-bzip/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-3.1.1.tgz", + "integrity": "sha512-GX0Ix/CJcHyB8c4ykpHGIAvLyOwOobtM/8d+TQkAd81/bEjgPHrfba41Vpesr7jX/t8Uh+R3EX9eAS5be+jQYg==", + "dependencies": { + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/semver-diff/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/semver-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/semver-regex/-/semver-regex-2.0.0.tgz", + "integrity": "sha512-mUdIBBvdn0PLOeP3TEkMH7HHeUP3GjsXCwKarjv/kGmUFOYg1VqEemKhoQpWMu6X2I8kHeuVdGibLGkVK+/5Qw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/semver-truncate": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/semver-truncate/-/semver-truncate-1.1.2.tgz", + "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", + "dependencies": { + "semver": "^5.3.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/semver-truncate/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dependencies": { + "shebang-regex": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/signal-exit": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" + }, + "node_modules/sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dependencies": { + "is-plain-obj": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sort-keys-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sort-keys-length/-/sort-keys-length-1.0.1.tgz", + "integrity": "sha1-nLb09OnkgVWmqgZx7dM2/xR5oYg=", + "dependencies": { + "sort-keys": "^1.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/string_decoder/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-dirs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-dirs/-/strip-dirs-2.1.0.tgz", + "integrity": "sha512-JOCxOeKLm2CAS73y/U4ZeZPTkE+gNVCzKt7Eox84Iej1LT/2pTWYpZKJuxwQpvX1LiZb1xokNR7RLfuBAa7T3g==", + "dependencies": { + "is-natural-number": "^4.0.1" + } + }, + "node_modules/strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-outer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz", + "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tar-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-1.6.2.tgz", + "integrity": "sha512-rzS0heiNf8Xn7/mpdSVVSMAWAoy9bfb1WOTYC78Z0UQKeKa/CWS8FOq0lKGNa8DWKAn9gxjCvMLYc5PGXYlK2A==", + "dependencies": { + "bl": "^1.0.0", + "buffer-alloc": "^1.2.0", + "end-of-stream": "^1.0.0", + "fs-constants": "^1.0.0", + "readable-stream": "^2.3.0", + "to-buffer": "^1.1.1", + "xtend": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/temp-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/temp-dir/-/temp-dir-1.0.0.tgz", + "integrity": "sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0=", + "engines": { + "node": ">=4" + } + }, + "node_modules/tempfile": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/tempfile/-/tempfile-2.0.0.tgz", + "integrity": "sha1-awRGhWqbERTRhW/8vlCczLCXcmU=", + "dependencies": { + "temp-dir": "^1.0.0", + "uuid": "^3.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "node_modules/timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-buffer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.1.1.tgz", + "integrity": "sha512-lx9B5iv7msuFYE3dytT+KE5tap+rNYw+K4jVkb9R/asAb+pbBSM17jtunHplhBe6RRJdZx3Pn2Jph24O32mOVg==" + }, + "node_modules/to-readable-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/to-readable-stream/-/to-readable-stream-1.0.0.tgz", + "integrity": "sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q==", + "engines": { + "node": ">=6" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/trim-repeated": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz", + "integrity": "sha1-42RqLqTokTEr9+rObPsFOAvAHCE=", + "dependencies": { + "escape-string-regexp": "^1.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/tsscmp": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", + "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==", + "engines": { + "node": ">=0.6.x" + } + }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/unique-string": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", + "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", + "dependencies": { + "crypto-random-string": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/update-notifier": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-5.1.0.tgz", + "integrity": "sha512-ItnICHbeMh9GqUy31hFPrD1kcuZ3rpxDZbf4KUDavXwS0bW5m7SLbDQpGX3UYr072cbrF5hFUs3r5tUsPwjfHw==", + "dependencies": { + "boxen": "^5.0.0", + "chalk": "^4.1.0", + "configstore": "^5.0.1", + "has-yarn": "^2.1.0", + "import-lazy": "^2.1.0", + "is-ci": "^2.0.0", + "is-installed-globally": "^0.4.0", + "is-npm": "^5.0.0", + "is-yarn-global": "^0.3.0", + "latest-version": "^5.1.0", + "pupa": "^2.1.1", + "semver": "^7.3.4", + "semver-diff": "^3.1.1", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/url-parse-lax": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "dependencies": { + "prepend-http": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/url-to-options": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/url-to-options/-/url-to-options-1.0.1.tgz", + "integrity": "sha1-FQWgOiiaSMvXpDTvuu7FBV9WM6k=", + "engines": { + "node": ">= 4" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "node_modules/uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", + "bin": { + "uuid": "bin/uuid" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/widest-line": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-3.1.0.tgz", + "integrity": "sha512-NsmoXalsWVDMGupxZ5R08ka9flZjjiLvHVAWYOKtiKM8ujtZWr9cRffak+uSE48+Ob8ObalXpwyeUiyDD6QFgg==", + "dependencies": { + "string-width": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "engines": { + "node": ">=0.4" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha1-x+sXyT4RLLEIb6bY5R+wZnt5pfk=", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/ylru": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ylru/-/ylru-1.2.1.tgz", + "integrity": "sha512-faQrqNMzcPCHGVC2aaOINk13K+aaBDUPjGWl0teOXywElLjyVAB6Oe2jj62jHYtwsU49jXhScYbvPENK+6zAvQ==", + "engines": { + "node": ">= 4.0.0" + } + } + }, "dependencies": { "@babel/runtime": { - "version": "7.15.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.15.3.tgz", - "integrity": "sha512-OvwMLqNXkCXSz1kSm58sEsNuhqOx/fKpnUnKnFB5v8uDda5bLNEHNgKPvhDN6IU0LDcnHQ90LlJ0Q6jnyBSIBA==", + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.18.3.tgz", + "integrity": "sha512-38Y8f7YUhce/K7RMwTp7m0uCumpv9hZkitCbBClqQIow1qSbCvGkcegKOXpEWCQLfWmevgRiWokZ1GkpfhbZug==", "requires": { "regenerator-runtime": "^0.13.4" } }, "@sindresorhus/is": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", - "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", + "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" }, "@szmarczak/http-timer": { "version": "1.1.2", @@ -35,52 +3150,25 @@ } }, "ansi-align": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.0.tgz", - "integrity": "sha512-ZpClVKqXN3RGBmKibdfWzqCY4lnjEuoNzU5T0oEFpfd/z5qJHVarukridD4juLO2FXMiwUQxr9WqQtaYa8XRYw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-3.0.1.tgz", + "integrity": "sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==", "requires": { - "string-width": "^3.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", - "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" - }, - "string-width": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", - "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", - "requires": { - "emoji-regex": "^7.0.1", - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^5.1.0" - } - }, - "strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "requires": { - "ansi-regex": "^4.1.0" - } - } + "string-width": "^4.1.0" } }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" - }, - "any-promise": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", - "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "requires": { + "color-convert": "^2.0.1" + } }, "anymatch": { "version": "3.1.2", @@ -99,7 +3187,7 @@ "archive-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/archive-type/-/archive-type-4.0.0.tgz", - "integrity": "sha1-+S5yIzBW38aWlHJ0nCZ72wRrHXA=", + "integrity": "sha512-zV4Ky0v1F8dBrdYElwTvQhweQ0P7Kwc1aluqJsYtOBP01jXcWCyW2IEfI1YiqsG+Iy7ZR+o5LF1N+PGECBxHWA==", "requires": { "file-type": "^4.2.0" }, @@ -107,29 +3195,21 @@ "file-type": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-4.4.0.tgz", - "integrity": "sha1-G2AOX8ofvcboDApwxxyNul95BsU=" + "integrity": "sha512-f2UbFQEk7LXgWpi5ntcO86OeA/cC80fuDDDaX/fZ2ZGel+AF7leRQqBBW1eJNiiQkrZlAoM6P+VYP5P6bOlDEQ==" } } }, "argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "requires": { - "sprintf-js": "~1.0.2" - } - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "autolinker": { - "version": "3.14.3", - "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.14.3.tgz", - "integrity": "sha512-t81i2bCpS+s+5FIhatoww9DmpjhbdiimuU9ATEuLxtZMQ7jLv9fyFn7SWNG8IkEfD4AmYyirL1ss9k1aqVWRvg==", + "version": "3.15.0", + "resolved": "https://registry.npmjs.org/autolinker/-/autolinker-3.15.0.tgz", + "integrity": "sha512-N/5Dk5AZnqL9k6kkHdFIGLm/0/rRuSnJwqYYhLCJjU7ZtiaJwCBzNTvjzy1zzJADngv/wvtHYcrPHytPnASeFA==", "requires": { - "tslib": "^1.9.3" + "tslib": "^2.3.0" } }, "base64-js": { @@ -193,13 +3273,10 @@ "strip-eof": "^1.0.0" } }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -211,6 +3288,13 @@ "bin-version": "^3.0.0", "semver": "^5.6.0", "semver-truncate": "^1.1.2" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "bin-wrapper": { @@ -226,6 +3310,25 @@ "pify": "^4.0.1" }, "dependencies": { + "@sindresorhus/is": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.7.0.tgz", + "integrity": "sha512-ONhaKPIufzzrlNbqtWFFd+jlnemX6lJAgq9ZeiZtS7I1PIf/la7CW4m83rTXRnVnsMbW2k56pGYu7AUFJD9Pow==" + }, + "cacheable-request": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", + "integrity": "sha512-vag0O2LKZ/najSoUwDbVlnlCFvhBE/7mGTY2B5FgCBDcRD+oVV1HYTOwM6JZfMg/hIcM6IwnTZ1uQQL5/X3xIQ==", + "requires": { + "clone-response": "1.0.2", + "get-stream": "3.0.0", + "http-cache-semantics": "3.8.1", + "keyv": "3.0.0", + "lowercase-keys": "1.0.0", + "normalize-url": "2.0.1", + "responselike": "1.0.2" + } + }, "download": { "version": "7.1.0", "resolved": "https://registry.npmjs.org/download/-/download-7.1.0.tgz", @@ -293,6 +3396,54 @@ } } }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + }, + "import-lazy": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", + "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==" + }, + "keyv": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", + "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "requires": { + "json-buffer": "3.0.0" + } + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "normalize-url": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", + "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", + "requires": { + "prepend-http": "^2.0.0", + "query-string": "^5.0.1", + "sort-keys": "^2.0.0" + } + }, "p-cancelable": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.4.1.tgz", @@ -314,22 +3465,12 @@ "p-finally": "^1.0.0" } }, - "pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" - }, - "prepend-http": { + "sort-keys": { "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", + "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", "requires": { - "prepend-http": "^2.0.0" + "is-plain-obj": "^1.0.0" } } } @@ -349,50 +3490,18 @@ } }, "boxen": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.0.1.tgz", - "integrity": "sha512-49VBlw+PrWEF51aCmy7QIteYPIFZxSpvqBdP/2itCPPlJ49kj9zg/XPRFrdkne2W+CfwXUls8exMvu1RysZpKA==", + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-5.1.2.tgz", + "integrity": "sha512-9gYgQKXx+1nP8mP7CzFyaUARhg7D3n1dF/FnErWmu9l6JvGpNUN278h0aSb+QjoiKSWG+iZ3uHrcqk0qrY9RQQ==", "requires": { "ansi-align": "^3.0.0", "camelcase": "^6.2.0", "chalk": "^4.1.0", "cli-boxes": "^2.2.1", - "string-width": "^4.2.0", + "string-width": "^4.2.2", "type-fest": "^0.20.2", "widest-line": "^3.1.0", "wrap-ansi": "^7.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "camelcase": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz", - "integrity": "sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg==" - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - } } }, "braces": { @@ -429,12 +3538,12 @@ "buffer-crc32": { "version": "0.2.13", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", - "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=" + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" }, "buffer-fill": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-fill/-/buffer-fill-1.0.0.tgz", - "integrity": "sha1-+PeLdniYiO858gXNY39o5wISKyw=" + "integrity": "sha512-T7zexNBwiiaCOGDg9xNX9PBmjrubblRkENuptryuI64URkXDFum9il/JGL8Lm8wYfAXpredVXXZz7eMHilimiQ==" }, "cache-content-type": { "version": "1.0.1", @@ -446,44 +3555,38 @@ } }, "cacheable-request": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-2.1.4.tgz", - "integrity": "sha1-DYCIAbY0KtM8kd+dC0TcCbkeXD0=", - "requires": { - "clone-response": "1.0.2", - "get-stream": "3.0.0", - "http-cache-semantics": "3.8.1", - "keyv": "3.0.0", - "lowercase-keys": "1.0.0", - "normalize-url": "2.0.1", - "responselike": "1.0.2" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", + "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^3.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^4.1.0", + "responselike": "^1.0.2" }, "dependencies": { "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } }, "lowercase-keys": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", - "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" } } }, "camelcase": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", - "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" - }, - "camelcase-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", - "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", - "requires": { - "camelcase": "^2.0.0", - "map-obj": "^1.0.0" - } + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" }, "caw": { "version": "2.0.1", @@ -497,15 +3600,12 @@ } }, "chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" } }, "chokidar": { @@ -560,9 +3660,9 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" }, "config-chain": { "version": "1.1.13", @@ -571,6 +3671,13 @@ "requires": { "ini": "^1.3.4", "proto-list": "~1.2.1" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + } } }, "configstore": { @@ -584,41 +3691,14 @@ "unique-string": "^2.0.0", "write-file-atomic": "^3.0.0", "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "requires": { - "semver": "^6.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - } } }, - "console-stream": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/console-stream/-/console-stream-0.1.1.tgz", - "integrity": "sha1-oJX+B7IEZZVfL6/Si11yvM2UnUQ=" - }, "content-disposition": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", - "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", "requires": { - "safe-buffer": "5.1.2" - }, - "dependencies": { - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - } + "safe-buffer": "5.2.1" } }, "content-type": { @@ -643,11 +3723,27 @@ "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", "requires": { "lru-cache": "^4.0.1", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + } } }, "crypto-random-string": { @@ -655,31 +3751,18 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==" }, - "currently-unhandled": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", - "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", - "requires": { - "array-find-index": "^1.0.1" - } - }, "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", "requires": { - "ms": "2.0.0" + "ms": "2.1.2" } }, - "decamelize": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", - "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" - }, "decode-uri-component": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", - "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=" + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", + "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==" }, "decompress": { "version": "4.2.1", @@ -694,6 +3777,28 @@ "make-dir": "^1.0.0", "pify": "^2.3.0", "strip-dirs": "^2.0.0" + }, + "dependencies": { + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + }, + "dependencies": { + "pify": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", + "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + } + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } } }, "decompress-response": { @@ -746,7 +3851,7 @@ "decompress-unzip": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/decompress-unzip/-/decompress-unzip-4.0.1.tgz", - "integrity": "sha1-3qrM39FK6vhVePczroIQ+bSEj2k=", + "integrity": "sha512-1fqeluvxgnn86MOh66u8FjbtJpAFv5wgCT9Iw8rcBqQcCo5tO8eiJw7NNTrvt9n4CRBVq7CstiS922oPgyGLrw==", "requires": { "file-type": "^3.8.0", "get-stream": "^2.2.0", @@ -757,7 +3862,21 @@ "file-type": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-3.9.0.tgz", - "integrity": "sha1-JXoHg4TR24CHvESdEH1SpSZyuek=" + "integrity": "sha512-RLoqTXE8/vPmMuTI88DAzhMYC99I8BWv7zYP4A1puo5HIjEJ5EX48ighy4ZyKMG9EDXxBgW6e++cn7d1xuFghA==" + }, + "get-stream": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", + "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "requires": { + "object-assign": "^4.0.1", + "pinkie-promise": "^2.0.0" + } + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" } } }, @@ -827,10 +3946,57 @@ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" }, + "got": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", + "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", + "requires": { + "decompress-response": "^3.2.0", + "duplexer3": "^0.1.4", + "get-stream": "^3.0.0", + "is-plain-obj": "^1.1.0", + "is-retry-allowed": "^1.0.0", + "is-stream": "^1.0.0", + "isurl": "^1.0.0-alpha5", + "lowercase-keys": "^1.0.0", + "p-cancelable": "^0.3.0", + "p-timeout": "^1.1.1", + "safe-buffer": "^5.0.1", + "timed-out": "^4.0.0", + "url-parse-lax": "^1.0.0", + "url-to-options": "^1.0.1" + } + }, + "make-dir": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", + "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "requires": { + "pify": "^3.0.0" + } + }, + "p-cancelable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", + "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + }, "pify": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "requires": { + "prepend-http": "^1.0.1" + } } } }, @@ -845,9 +4011,9 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" }, "emoji-regex": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", - "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "encodeurl": { "version": "1.0.2", @@ -862,14 +4028,6 @@ "once": "^1.4.0" } }, - "error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "requires": { - "is-arrayish": "^0.2.1" - } - }, "escape-goat": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-2.1.1.tgz", @@ -883,12 +4041,12 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" }, "execa": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", - "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "integrity": "sha512-RztN09XglpYI7aBBrJCPW95jEH7YF1UEPOoX9yDhUTPdp7mK+CQvnLTuD10BNXZ3byLTu2uehZ8EcKT/4CGiFw==", "requires": { "cross-spawn": "^5.0.1", "get-stream": "^3.0.0", @@ -912,6 +4070,13 @@ "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", "requires": { "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + } } }, "ext-list": { @@ -934,29 +4099,20 @@ "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", - "integrity": "sha1-JcfInLH5B3+IkbvmHY85Dq4lbx4=", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "requires": { "pend": "~1.2.0" } }, - "figures": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", - "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", - "requires": { - "escape-string-regexp": "^1.0.5", - "object-assign": "^4.1.0" - } - }, "file-type": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/file-type/-/file-type-5.2.0.tgz", - "integrity": "sha1-LdvqfHP/42No365J3DOMBYwritY=" + "integrity": "sha512-Iq1nJ6D2+yIO4c8HHg4fyVb8mAJieo1Oloy1mLLaB2PvezNedhBVm+QU7g0qM42aiMbRXTxKKwGD17rjKNJYVQ==" }, "filename-reserved-regex": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz", - "integrity": "sha1-q/c9+rc10EVECr/qLZHzieu/oik=" + "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==" }, "filenamify": { "version": "2.1.0", @@ -976,15 +4132,6 @@ "to-regex-range": "^5.0.1" } }, - "find-up": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", - "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", - "requires": { - "path-exists": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "find-versions": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/find-versions/-/find-versions-3.2.0.tgz", @@ -1001,7 +4148,7 @@ "from2": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "integrity": "sha512-OMcX/4IC/uqEPVgGeyfN22LJk6AZrMkRZHxcHBMBvHScDGgwTm2GT2Wkgtocyd3JfZffjj2kYUDXXII0Fk9W0g==", "requires": { "inherits": "^2.0.1", "readable-stream": "^2.0.0" @@ -1018,11 +4165,6 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, "get-proxy": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/get-proxy/-/get-proxy-2.1.0.tgz", @@ -1031,18 +4173,12 @@ "npm-conf": "^1.1.0" } }, - "get-stdin": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", - "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" - }, "get-stream": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-2.3.1.tgz", - "integrity": "sha1-Xzj5PzRgCWZu4BUKBUFn+Rvdld4=", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "requires": { - "object-assign": "^4.0.1", - "pinkie-promise": "^2.0.0" + "pump": "^3.0.0" } }, "glob-parent": { @@ -1059,63 +4195,30 @@ "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", "requires": { "ini": "2.0.0" - }, - "dependencies": { - "ini": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", - "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" - } } }, "got": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/got/-/got-7.1.0.tgz", - "integrity": "sha512-Y5WMo7xKKq1muPsxD+KmrR8DH5auG7fBdDVueZwETwV6VytKyU9OX/ddpq2/1hp1vIPvVb4T81dKQz3BivkNLw==", - "requires": { - "decompress-response": "^3.2.0", + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", + "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", + "requires": { + "@sindresorhus/is": "^0.14.0", + "@szmarczak/http-timer": "^1.1.2", + "cacheable-request": "^6.0.0", + "decompress-response": "^3.3.0", "duplexer3": "^0.1.4", - "get-stream": "^3.0.0", - "is-plain-obj": "^1.1.0", - "is-retry-allowed": "^1.0.0", - "is-stream": "^1.0.0", - "isurl": "^1.0.0-alpha5", - "lowercase-keys": "^1.0.0", - "p-cancelable": "^0.3.0", - "p-timeout": "^1.1.1", - "safe-buffer": "^5.0.1", - "timed-out": "^4.0.0", - "url-parse-lax": "^1.0.0", - "url-to-options": "^1.0.1" - }, - "dependencies": { - "get-stream": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", - "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" - } + "get-stream": "^4.1.0", + "lowercase-keys": "^1.0.1", + "mimic-response": "^1.0.1", + "p-cancelable": "^1.0.0", + "to-readable-stream": "^1.0.0", + "url-parse-lax": "^3.0.0" } }, "graceful-fs": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", - "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", - "requires": { - "ansi-regex": "^2.0.0" - } + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, "has-flag": { "version": "4.0.0", @@ -1153,11 +4256,6 @@ "resolved": "https://registry.npmjs.org/has-yarn/-/has-yarn-2.1.0.tgz", "integrity": "sha512-UqBRqi4ju7T+TqGNdqAO0PaSVGsDGJUBQvk9eUWNGRY1CFGDzYhLWoM7JQEemnlvVcv/YEmc2wNW8BC24EnUsw==" }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, "http-assert": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/http-assert/-/http-assert-1.5.0.tgz", @@ -1168,20 +4266,20 @@ } }, "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.0.tgz", - "integrity": "sha512-4I8r0C5JDhT5VkvI47QktDW75rNlGVsUf/8hzjCC/wkWI/jdTRmBb9aI7erSG82r1bjKY3F6k28WnsVxB1C73A==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", "requires": { "depd": "~1.1.2", "inherits": "2.0.4", "setprototypeof": "1.2.0", "statuses": ">= 1.5.0 < 2", - "toidentifier": "1.0.0" + "toidentifier": "1.0.1" }, "dependencies": { "depd": { @@ -1197,32 +4295,24 @@ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" }, "import-lazy": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-3.1.0.tgz", - "integrity": "sha512-8/gvXvX2JMn0F+CDlSC4l6kOmVaLOO3XLkksI7CI3Ud95KDYJuYur2b9P/PUt/i/pDAMd/DulQsNbbbmRRsDIQ==" + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", + "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" }, - "indent-string": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", - "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", - "requires": { - "repeating": "^2.0.0" - } - }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", - "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==" }, "into-stream": { "version": "3.1.0", @@ -1233,11 +4323,6 @@ "p-is-promise": "^1.1.0" } }, - "is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -1254,14 +4339,6 @@ "ci-info": "^2.0.0" } }, - "is-core-module": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.6.0.tgz", - "integrity": "sha512-wShG8vs60jKfPWpF2KZRaAtvt3a20OAn7+IJ6hLPECpSABLcKtFKTTI4ZtH5QcBruBHlq+WsdHWyz0BCZW7svQ==", - "requires": { - "has": "^1.0.3" - } - }, "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", @@ -1272,15 +4349,10 @@ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, - "is-finite": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", - "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==" - }, "is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "is-generator-function": { "version": "1.0.10", @@ -1291,9 +4363,9 @@ } }, "is-glob": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", - "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { "is-extglob": "^2.1.1" } @@ -1357,11 +4429,6 @@ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" }, - "is-utf8": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", - "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=" - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -1394,17 +4461,32 @@ "is-object": "^1.0.1" } }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + }, "json-buffer": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.0.tgz", "integrity": "sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg=" }, "katex": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.12.0.tgz", - "integrity": "sha512-y+8btoc/CK70XqcHqjxiGWBOeIL8upbS0peTPXTvgrh21n1RiWWcIpSWM+4uXq+IAgNh9YYQWdc7LVDPDAEEAg==", + "version": "0.15.6", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.15.6.tgz", + "integrity": "sha512-UpzJy4yrnqnhXvRPhjEuLA4lcPn6eRngixW7Q3TJErjg3Aw2PuLFBzTkdUb89UtumxjhHTqL3a5GDGETMSwgJA==", "requires": { - "commander": "^2.19.0" + "commander": "^8.0.0" + }, + "dependencies": { + "commander": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" + } } }, "keygrip": { @@ -1416,24 +4498,24 @@ } }, "keyv": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.0.0.tgz", - "integrity": "sha512-eguHnq22OE3uVoSYG0LVWNP+4ppamWr9+zWBe1bsNcovIMy6huUJFPgy4mGwCd/rnl3vOLGW1MTlu4c57CT1xA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-3.1.0.tgz", + "integrity": "sha512-9ykJ/46SN/9KPM/sichzQ7OvXyGDYKGTaDlKMGCAlg2UK8KRy4jb0d8sFc+0Tt0YYnThq8X2RZgCg74RPxgcVA==", "requires": { "json-buffer": "3.0.0" } }, "koa": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.1.tgz", - "integrity": "sha512-Lb2Dloc72auj5vK4X4qqL7B5jyDPQaZucc9sR/71byg7ryoD1NCaCm63CShk9ID9quQvDEi1bGR/iGjCG7As3w==", + "version": "2.13.4", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.13.4.tgz", + "integrity": "sha512-43zkIKubNbnrULWlHdN5h1g3SEKXOEzoAlRsHOTFpnlDu8JlAOZSMJBLULusuXRequboiwJcj5vtYXKB3k7+2g==", "requires": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", "content-disposition": "~0.5.2", "content-type": "^1.0.4", "cookies": "~0.8.0", - "debug": "~3.1.0", + "debug": "^4.3.2", "delegates": "^1.0.0", "depd": "^2.0.0", "destroy": "^1.0.4", @@ -1444,7 +4526,7 @@ "http-errors": "^1.6.3", "is-generator-function": "^1.0.7", "koa-compose": "^4.1.0", - "koa-convert": "^1.2.0", + "koa-convert": "^2.0.0", "on-finished": "^2.3.0", "only": "~0.0.2", "parseurl": "^1.3.2", @@ -1459,22 +4541,12 @@ "integrity": "sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==" }, "koa-convert": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-1.2.0.tgz", - "integrity": "sha1-2kCHXfSd4FOQmNFwC1CCDOvNIdA=", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/koa-convert/-/koa-convert-2.0.0.tgz", + "integrity": "sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==", "requires": { "co": "^4.6.0", - "koa-compose": "^3.0.0" - }, - "dependencies": { - "koa-compose": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/koa-compose/-/koa-compose-3.2.1.tgz", - "integrity": "sha1-qFzLQLfZhtjlo0Wzoazo6rz1Tec=", - "requires": { - "any-promise": "^1.1.0" - } - } + "koa-compose": "^4.1.0" } }, "latest-version": { @@ -1482,42 +4554,7 @@ "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-5.1.0.tgz", "integrity": "sha512-weT+r0kTkRQdCdYCNtkMwWXQTMEswKrFBkm4ckQOMVhhqhIMI1UT2hMj+1iigIhgSZm5gTmrRXBNoGUgaTY1xA==", "requires": { - "package-json": "^6.3.0" - } - }, - "load-json-file": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", - "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", - "requires": { - "graceful-fs": "^4.1.2", - "parse-json": "^2.2.0", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0", - "strip-bom": "^2.0.0" - } - }, - "logalot": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/logalot/-/logalot-2.1.0.tgz", - "integrity": "sha1-X46MkNME7fElMJUaVVSruMXj9VI=", - "requires": { - "figures": "^1.3.5", - "squeak": "^1.0.0" - } - }, - "longest": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", - "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" - }, - "loud-rejection": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", - "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", - "requires": { - "currently-unhandled": "^0.4.1", - "signal-exit": "^3.0.0" + "package-json": "^6.3.0" } }, "lowercase-keys": { @@ -1525,86 +4562,63 @@ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.1.tgz", "integrity": "sha512-G2Lj61tXDnVFFOi8VZds+SoQjtQC3dgokKdDG2mTm1tx4m50NUHBOZSBwQQHyy0V12A0JTG4icfZQH+xPyh8VA==" }, - "lpad-align": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/lpad-align/-/lpad-align-1.1.2.tgz", - "integrity": "sha1-IfYArBwwlcPG5JfuZyce4ISB/p4=", - "requires": { - "get-stdin": "^4.0.1", - "indent-string": "^2.1.0", - "longest": "^1.0.0", - "meow": "^3.3.0" - } - }, "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "yallist": "^4.0.0" } }, "make-dir": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz", - "integrity": "sha512-2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "requires": { - "pify": "^3.0.0" + "semver": "^6.0.0" }, "dependencies": { - "pify": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", - "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, - "map-obj": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", - "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" - }, "markmap-cli": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/markmap-cli/-/markmap-cli-0.5.3.tgz", - "integrity": "sha512-iEnTcjc2wM40nfs2w+WlIa53HpKCibNd2RmnRJgeaDXYZKg9egXN4kF1uUDxBpHqlTVL70kPlRU5umFCUoB9gQ==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/markmap-cli/-/markmap-cli-0.13.3.tgz", + "integrity": "sha512-+HhtOoHW6JddFqESLGElaapRWX8IT9QiBO9BcSXX9KOomzaXxUikThwDwxy6loBuCusrYRq58G6rVrJw4W5o9Q==", "requires": { "@babel/runtime": "^7.13.10", "chokidar": "^3.5.1", "commander": "^7.1.0", "koa": "^2.13.1", - "markmap-lib": "^0.11.6", + "markmap-lib": "^0.13.3", "open": "^8.0.3", "update-notifier": "^5.1.0" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" - } } }, "markmap-common": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/markmap-common/-/markmap-common-0.1.5.tgz", - "integrity": "sha512-bZj02doiGrPvllN25Pfm3msj/dkZy6oVFmgoG0Hldui7TRLJqI1vfbIqbXag7wTviuNeGLKtyrMqSdEMGa5+NA==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/markmap-common/-/markmap-common-0.13.3.tgz", + "integrity": "sha512-bKdEUgeLmloyJXrPErg+LdD7HppqRm836TQzhIWN1Wm5THOG8POouAdnLh14X6JCe1ofFbEMhPMZFs9unRLhtQ==", "requires": { "@babel/runtime": "^7.12.1" } }, "markmap-lib": { - "version": "0.11.6", - "resolved": "https://registry.npmjs.org/markmap-lib/-/markmap-lib-0.11.6.tgz", - "integrity": "sha512-9CnLt/vZzNgW3kO/wqldhinKBbK/h8WUx5GGVjdn2JTs/DrDcZZbvAyVmke3VG+mnWwYHsnjLVIiCbPi5PaepA==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/markmap-lib/-/markmap-lib-0.13.3.tgz", + "integrity": "sha512-4ldQfldiEZddMOUoEJnfVpekiJas+mG9D9oAUpDM+9Ypg+x3bThnjjXlx8isfXsSjRV6caZnn4+I9lAa2i5Wfg==", "requires": { - "@babel/runtime": "^7.12.5", - "katex": "^0.12.0", - "markmap-common": "^0.1.5", - "prismjs": "^1.21.0", - "remarkable": "^2.0.0", - "remarkable-katex": "^1.1.6" + "@babel/runtime": "^7.16.3", + "js-yaml": "^4.1.0", + "katex": "^0.15.1", + "markmap-common": "^0.13.3", + "prismjs": "^1.25.0", + "remarkable": "^2.0.1", + "remarkable-katex": "^1.1.8" } }, "media-typer": { @@ -1612,34 +4626,17 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" }, - "meow": { - "version": "3.7.0", - "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", - "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", - "requires": { - "camelcase-keys": "^2.0.0", - "decamelize": "^1.1.2", - "loud-rejection": "^1.0.0", - "map-obj": "^1.0.1", - "minimist": "^1.1.3", - "normalize-package-data": "^2.3.4", - "object-assign": "^4.0.1", - "read-pkg-up": "^1.0.1", - "redent": "^1.0.0", - "trim-newlines": "^1.0.0" - } - }, "mime-db": { - "version": "1.49.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.49.0.tgz", - "integrity": "sha512-CIc8j9URtOVApSFCQIF+VBkX1RwXp/oMMOrqdyXSBXq5RWNEsRfyj1kiRnQgmNXmHxPoFIxOroKA3zcU9P+nAA==" + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "mime-types": { - "version": "2.1.32", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.32.tgz", - "integrity": "sha512-hJGaVS4G4c9TSMYh2n6SQAGrC4RnfU+daP8G7cSCmaqNjiOoUY0VHCMS42pxnQmVF1GWwFhbHWn3RIxCqTmZ9A==", + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "requires": { - "mime-db": "1.49.0" + "mime-db": "1.51.0" } }, "mimic-response": { @@ -1648,14 +4645,14 @@ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" }, "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "negotiator": { "version": "0.6.2", @@ -1667,46 +4664,15 @@ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - } - }, "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-url": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-2.0.1.tgz", - "integrity": "sha512-D6MUW4K/VzoJ4rJ01JFKxDrtY1v9wrgzCX5f2qj/lzH1m/lW6MhUZFKerVsnyjOhOsYzI9Kqqak+10l4LvLpMw==", - "requires": { - "prepend-http": "^2.0.0", - "query-string": "^5.0.1", - "sort-keys": "^2.0.0" - }, - "dependencies": { - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, - "sort-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-2.0.0.tgz", - "integrity": "sha1-ZYU1WEhh7JfXMNbPQYIuH1ZoQSg=", - "requires": { - "is-plain-obj": "^1.0.0" - } - } - } + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", + "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" }, "npm-conf": { "version": "1.1.3", @@ -1759,9 +4725,9 @@ "integrity": "sha1-Kv3oTQPlC5qO3EROMGEKcCle37Q=" }, "open": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.2.1.tgz", - "integrity": "sha512-rXILpcQlkF/QuFez2BJDf3GsqpjGKbkUUToAIGo9A0Q6ZkoSGogZJulrUdwRkrAsoQvoZsrjCYt8+zblOk7JQQ==", + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -1769,13 +4735,12 @@ } }, "optipng-bin": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-7.0.0.tgz", - "integrity": "sha512-mesUAwfedu5p9gRQwlYgD6Svw5IH3VUIWDJj/9cNpP3yFNbbEVqkTMWYhrIEn/cxmbGA3LpZrdoV2Yl8OfmnIA==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/optipng-bin/-/optipng-bin-9.0.0.tgz", + "integrity": "sha512-uDcmcNK4MRSM5ezLThUPI7fc9ZxlQMqnxhWxIc7foCcUZZ2LvzbcJwwVEsU78tC3t9B68dwE4y/m6at10Z93UA==", "requires": { "bin-build": "^3.0.0", - "bin-wrapper": "^4.0.0", - "logalot": "^2.0.0" + "bin-wrapper": "^4.0.0" } }, "os-filter-obj": { @@ -1787,9 +4752,9 @@ } }, "p-cancelable": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-0.3.0.tgz", - "integrity": "sha512-RVbZPLso8+jFeq1MfNvgXtCRED2raz/dKpacfTNxsx6pLEpEomM7gah6VeHSYV3+vo0OAi4MkArtQcWWXuQoyw==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", + "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" }, "p-event": { "version": "1.3.0", @@ -1841,156 +4806,37 @@ "semver": "^6.2.0" }, "dependencies": { - "@sindresorhus/is": { - "version": "0.14.0", - "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", - "integrity": "sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==" - }, - "cacheable-request": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-6.1.0.tgz", - "integrity": "sha512-Oj3cAGPCqOZX7Rz64Uny2GYAZNliQSqfbePrgAQ1wKAihYmCUnraBtJtKcGR4xz7wF+LoJC+ssFZvv5BgF9Igg==", - "requires": { - "clone-response": "^1.0.2", - "get-stream": "^5.1.0", - "http-cache-semantics": "^4.0.0", - "keyv": "^3.0.0", - "lowercase-keys": "^2.0.0", - "normalize-url": "^4.1.0", - "responselike": "^1.0.2" - }, - "dependencies": { - "get-stream": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", - "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", - "requires": { - "pump": "^3.0.0" - } - }, - "lowercase-keys": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", - "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" - } - } - }, - "get-stream": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", - "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", - "requires": { - "pump": "^3.0.0" - } - }, - "got": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/got/-/got-9.6.0.tgz", - "integrity": "sha512-R7eWptXuGYxwijs0eV+v3o6+XH1IqVK8dJOEecQfTmkncw9AV4dcw/Dhxi8MdlqPthxxpZyizMzyg8RTmEsG+Q==", - "requires": { - "@sindresorhus/is": "^0.14.0", - "@szmarczak/http-timer": "^1.1.2", - "cacheable-request": "^6.0.0", - "decompress-response": "^3.3.0", - "duplexer3": "^0.1.4", - "get-stream": "^4.1.0", - "lowercase-keys": "^1.0.1", - "mimic-response": "^1.0.1", - "p-cancelable": "^1.0.0", - "to-readable-stream": "^1.0.0", - "url-parse-lax": "^3.0.0" - } - }, - "http-cache-semantics": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" - }, - "normalize-url": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-4.5.1.tgz", - "integrity": "sha512-9UZCFRHQdNrfTpGg8+1INIg93B6zE0aXMVFkw1WFwvO4SlZywU6aLg5Of0Ap/PgcbSw4LNxvMWXMeugwMCX0AA==" - }, - "p-cancelable": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-1.1.0.tgz", - "integrity": "sha512-s73XxOZ4zpt1edZYZzvhqFa6uvQc1vwUa0K0BdtIZgQMAJj9IbebH+JkgKZc9h+B05PKHLOTl4ajG1BmNrVZlw==" - }, - "prepend-http": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", - "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" - }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" - }, - "url-parse-lax": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", - "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", - "requires": { - "prepend-http": "^2.0.0" - } } } }, - "parse-json": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", - "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", - "requires": { - "error-ex": "^1.2.0" - } - }, "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, - "path-exists": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", - "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", - "requires": { - "pinkie-promise": "^2.0.0" - } - }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" - }, - "path-type": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", - "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", - "requires": { - "graceful-fs": "^4.1.2", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - } - }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=" }, "picomatch": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz", - "integrity": "sha512-lY1Q/PiJGC2zOv/z391WOTD+Z02bCgsFfvxoXXf6h7kv9o+WmsmzYqrAwY63sNgOxE4xEdq0WyUnXfKeBrSvYw==" + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pinkie": { "version": "2.0.4", @@ -2006,14 +4852,14 @@ } }, "prepend-http": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", - "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=" + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", + "integrity": "sha1-6SQ0v6XqjBn0HN/UAddBo8gZ2Jc=" }, "prismjs": { - "version": "1.24.1", - "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.24.1.tgz", - "integrity": "sha512-mNPsedLuk90RVJioIky8ANZEwYm5w9LcvCXrxHlwf4fNVSn8jEipMybMkWUyyF0JhnC+C4VcOVSBuHRKs1L5Ow==" + "version": "1.28.0", + "resolved": "https://registry.npmjs.org/prismjs/-/prismjs-1.28.0.tgz", + "integrity": "sha512-8aaXdYvl1F7iC7Xm1spqSaY/OJBpYW3v+KJ+F17iYxvdc8sfjW194COK5wVhMZX45tGteiBQgdvD/nhxcRwylw==" }, "process-nextick-args": { "version": "2.0.1", @@ -2066,25 +4912,13 @@ "ini": "~1.3.0", "minimist": "^1.2.0", "strip-json-comments": "~2.0.1" - } - }, - "read-pkg": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", - "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", - "requires": { - "load-json-file": "^1.0.0", - "normalize-package-data": "^2.3.2", - "path-type": "^1.0.0" - } - }, - "read-pkg-up": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", - "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", - "requires": { - "find-up": "^1.0.0", - "read-pkg": "^1.0.0" + }, + "dependencies": { + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + } } }, "readable-stream": { @@ -2116,15 +4950,6 @@ "picomatch": "^2.2.1" } }, - "redent": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", - "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", - "requires": { - "indent-string": "^2.1.0", - "strip-indent": "^1.0.1" - } - }, "regenerator-runtime": { "version": "0.13.9", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", @@ -2153,29 +4978,22 @@ "requires": { "argparse": "^1.0.10", "autolinker": "^3.11.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + } } }, "remarkable-katex": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/remarkable-katex/-/remarkable-katex-1.1.8.tgz", - "integrity": "sha512-NdzPcO2ybt9TsLx/I5wwb2CIpG3LhLc8GhYzfpG50FryTok5ZJrgBo3iroW20hen0eZx1bhZkatxSo7+wBBJlQ==" - }, - "repeating": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", - "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", - "requires": { - "is-finite": "^1.0.0" - } - }, - "resolve": { - "version": "1.20.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", - "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", - "requires": { - "is-core-module": "^2.2.0", - "path-parse": "^1.0.6" - } + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/remarkable-katex/-/remarkable-katex-1.2.1.tgz", + "integrity": "sha512-Y1VquJBZnaVsfsVcKW2hmjT+pDL7mp8l5WAVlvuvViltrdok2m1AIKmJv8SsH+mBY84PoMw67t3kTWw1dIm8+g==" }, "responselike": { "version": "1.0.2", @@ -2196,12 +5014,22 @@ "integrity": "sha512-e1QtP3YL5tWww8uKaOCQ18UxIT2laNBXHjV/S2WYCiK4udiv8lkG89KRIoCjUagnAmCBurjF4zEVX2ByBbnCjQ==", "requires": { "commander": "^2.8.1" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "requires": { + "lru-cache": "^6.0.0" + } }, "semver-diff": { "version": "3.1.1", @@ -2229,6 +5057,13 @@ "integrity": "sha1-V/Qd5pcHpicJp+AQS6IRcQnqR+g=", "requires": { "semver": "^5.3.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + } } }, "setprototypeof": { @@ -2250,9 +5085,9 @@ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" }, "signal-exit": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", - "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==" }, "sort-keys": { "version": "1.1.2", @@ -2270,49 +5105,11 @@ "sort-keys": "^1.0.0" } }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.10", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", - "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" - }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" }, - "squeak": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/squeak/-/squeak-1.3.0.tgz", - "integrity": "sha1-MwRQN7ZDiLVnZ0uEMiplIQc5FsM=", - "requires": { - "chalk": "^1.0.0", - "console-stream": "^0.1.1", - "lpad-align": "^1.0.1" - } - }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", @@ -2323,41 +5120,6 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, - "string-width": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz", - "integrity": "sha512-XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==", - "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" - }, - "is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -2373,20 +5135,22 @@ } } }, - "strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "requires": { - "ansi-regex": "^2.0.0" + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" } }, - "strip-bom": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", - "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "requires": { - "is-utf8": "^0.2.0" + "ansi-regex": "^5.0.1" } }, "strip-dirs": { @@ -2402,14 +5166,6 @@ "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" }, - "strip-indent": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", - "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", - "requires": { - "get-stdin": "^4.0.1" - } - }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", @@ -2424,9 +5180,12 @@ } }, "supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "requires": { + "has-flag": "^4.0.0" + } }, "tar-stream": { "version": "1.6.2", @@ -2485,14 +5244,9 @@ } }, "toidentifier": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" - }, - "trim-newlines": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", - "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" }, "trim-repeated": { "version": "1.0.0", @@ -2503,9 +5257,9 @@ } }, "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "tsscmp": { "version": "1.0.6", @@ -2578,67 +5332,14 @@ "semver": "^7.3.4", "semver-diff": "^3.1.1", "xdg-basedir": "^4.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, - "import-lazy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-2.1.0.tgz", - "integrity": "sha1-BWmOPUXIjo1+nZLLBYTnfwlvPkM=" - }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.3.5", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", - "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "requires": { - "has-flag": "^4.0.0" - } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } } }, "url-parse-lax": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", - "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-3.0.0.tgz", + "integrity": "sha1-FrXK/Afb42dsGxmZF3gj1lA6yww=", "requires": { - "prepend-http": "^1.0.1" + "prepend-http": "^2.0.0" } }, "url-to-options": { @@ -2656,15 +5357,6 @@ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", @@ -2694,29 +5386,6 @@ "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", - "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "requires": { - "color-convert": "^2.0.1" - } - }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", - "requires": { - "ansi-regex": "^5.0.0" - } - } } }, "wrappy": { @@ -2746,9 +5415,9 @@ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yauzl": { "version": "2.10.0", diff --git a/pattern-categorization/package.json b/pattern-categorization/package.json index 56bda3a69..222df9751 100644 --- a/pattern-categorization/package.json +++ b/pattern-categorization/package.json @@ -3,8 +3,8 @@ "version": "0.0.1", "description": "Generate mindmap of the patterns in our book, using markmap.", "dependencies": { - "markmap-cli": "^0.5.3", - "optipng-bin": "^7.0.0" + "markmap-cli": ">=0.13.3", + "optipng-bin": "^9.0.0" }, "scripts": { "test": "echo \"Error: no test specified\" && exit 1" diff --git a/patterns/1-initial/balancing-openness-and-security.md b/patterns/1-initial/balancing-openness-and-security.md new file mode 100644 index 000000000..ee11406dd --- /dev/null +++ b/patterns/1-initial/balancing-openness-and-security.md @@ -0,0 +1,194 @@ +# Title + +Balancing Openness and Security + +# Patlet + +While InnerSource flourishes in environments with a high degree of shared code, Security/Legal prefers the limitation of source code access to only those that need it. +By making Security/Legal part of the team, introducing explicit sharing levels and security policies for shared repositories, as well as defining what qualifies as sensitive information, code sharing can be facilitated while minimizing the associated risks. + +# Problem + +A successful InnerSource program needs openness and transparency (e.g. access to code, issues, documentation, and roadmap), while good security practice is to minimize access, following the [principle of least privilege][principle-of-least-privilege]. How to balance and address these seemingly contradicting requirements? + +# Story + +Most organizations developing proprietary software will have source code that they do not want to leave the organization, as this may harm their business. Think what would happen when the major competitors would have access to their latest features and would know what they are working on next. + +Even when the source code management system is not compromised from the outside, malicious employees or interns could leak code to the competition. Or think about gaining access to sensitive systems and services using credentials that are hard-coded in source code. Or injection of malicious code into a product’s codebase. + +Restricting access typically reduces the risk of these things from happening, but at the same time hampers collaboration and re-use. + +# Context + +- The organization has an InnerSource Program Office (ISPO), or a similar group, steering the success of the InnerSource initiative in the organization. One of their goals is to stimulate maximum openness and transparency in the organization. +- The organization has a Security Team constraining unnecessary data access to prevent the organization from data-leakage and malicious code injection. +- The Security Team, ISPO, and Engineering teams are not regularly talking with each other. +- "Closed Source" is the default in the organization when creating new repositories, i.e. only the team owning/maintaining the code has access to the given repo. +- "Shared Source" within the organization isn’t common practice. Organizational teams aren’t familiar with what code or information should or shouldn’t be placed in shared repositories. + +# Forces + +- A successful InnerSource program needs openness and transparency (e.g. access to code, issues, documentation, and roadmap) +- Good security practice is to minimize access, following the [principle of least privilege][principle-of-least-privilege]. +- The Security Team is more familiar with security principles at conceptual level than security practices at operation level. Some of the security policy is good at concept but hard to execute at operation level. +- Engineering Teams focus more on service/product development or knowledge sharing than on measures for data protection. While it is easy for Engineering Teams to decide to close or open the repository, they are usually not willing to spend time on judging how to reach a balance between both. Or to refactor their code in order to be able to share more. +- No one-fit-all guideline or rules to judge what data or process is to be secured or not. That much depends on data sensitivity and overall security policy/infrastructure. + +# Solutions + +To reduce the misalignment and possible misunderstanding between the teams involved, it is key to bring everybody together so that they can express their goals and concerns, and develop shared language together. + +After that they can decide as a group how to drive the execution of the specific goals, and what to do to reduce the risks that were identified. + +## Setup + +Start by bringing (representatives from) Engineering, Security, Legal, and the ISPO together, to discuss the goals of the InnerSource initiative, as well as any security concerns. + +Some helpful practices are: + +- Form an InnerSource task force with representatives from Security, Legal, Engineering, and the ISPO to align on the goals of InnerSource adoption. +- Start with a limited scope to lower the potential security impact caused by the adoption. +- List the security concerns and figure out mitigation plans together within the task force. +- Clearly define the different sharing levels of repositories that you want to use in your organization *(Note: A more elaborate model is described under **Extension: An Additional Sharing Level**)*: + - **PUBLIC** - open source: accessible for all software developers in the world + - **SHARED** - inner source: accessible for all software developers in the organization + - **CLOSED** - closed source: only accessible to named individuals in the organization + +## Execution + +How to allow for a greater amount of SHARED code in the organizations depends a lot on the specific business domain, related regulations, and concerns identified in the initial meetings of the InnerSource task force as mentioned above. + +Following are some practices that have proven to be helpful in reducing security concerns and allowing for a greater amount of SHARED code. + +### Security Training and SCM Setup + +- Employee training about security awareness and individual responsibility +- Enhanced security measures or policies on source code management (SCM) system to prevent malicious access to shared repositories and reduce the impact of the same: + - Eliminate anonymous access to source code (all users must be logged in to your Source Code Management tool), log the access to repositories + - regular review by organization owners on created repositories and granted permission to organization members. + - Set up [Single Sign-On][single-sign-on] against your organization’s identity provider. This will automatically revoke access in case somebody leaves the organization. + - regular rotation of access token + - 2FA authentication enforced + - encourage the use of signed commits +- Monitoring the source code management system for suspicious access, e.g.: + - access from new accounts or new devices + - downloading source code from new devices + - downloading a great amount of source code in the monitoring period. + +### Split out the 'secret sauce' into separate repos + +Separate highly specific, differentiating code (the 'secret sauce') from code that is considered commodity in the organization (e.g. infrastructure, platform, and UI components). +By placing them in separate repositories, you increase your chances of offering the commodity code as SHARED repos, while the 'secret sauce' may stay CLOSED. + +### Prevent sensitive information in shared repositories + +Build up agreed security requirement of InnerSource, such as: + +- No hard-coded usernames, passwords or other access/security tokens in a repository. +- No client information in a repository. +- Business critical algorithms may not be placed in SHARED repositories. +- Code from SHARED repositories will not be distributed directly to Production. +- Leverage secrets scanning tools to scan the target repositories (including code, test cases, and helper scripts) for confidential data such as accounts, passwords, access tokens, keys, and other sensitive data. +- Keep repositories CLOSED, but expose metadata about the projects (i.e. through an [InnerSource Portal][innersource-portal]), and create some kind of access request workflow. This way you could still give people access to the code, but not open it to everyone by default. *(Note: The full model is described under **Extension: An Additional Sharing Level**)* + +### Extension: An Additional Sharing Level + +In some cases, introducing additional sharing levels might be appropriate. Use cases include: + +- semi-sensitive code that can be shared with larger groups of people, but for example not with all interns and contractors. +- Or not with people with certain nationalities or working in a specific country, in order to comply with [export control][export-control] regulations. +- Or legacy repositories that are not (yet) ready to be made available as SHARED. + +Without the additional sharing levels, (too) many repositories will end up as CLOSED in an existing organization, as all businesses will considering their code 'special', requiring extra protection and/or 'not ready' for opening up organization-wide yet (e.g. hard-coded secrets, but also technical debt, lacking documentation). + +And given discoverability is also important, adding the additional level that facilitates discoverability, but still provides a light-weight access gate could be an appropriate way to prevent too many CLOSED repositories. + +As a concrete example, which allows repositories to be discovered, even though there is no organization-wide access, consider the following sharing levels: + +- **PUBLIC** - open source: findable and accessible for all software developers in the world +- **INTERNAL** - inner source: findable and accessible for all software developers in the organization +- **RESTRICTED** - restricted source: findable for all software developers in the organization, low-friction process to gain full access. +- **CLOSED** - closed source: only accessible to named individuals and not findable via the search engine for other software developers in the organization. + +Repositories with RESTRICTED sharing level are included in the [central catalog][innersource-portal] and/or fed into the central search mechanism, together with their `README.md` and some meta information. Their full content however, is not accessible without following a light-weight access request process. This can for example be contacting one of the code owners or some other request mechanism described in the `README.md` file. + +*Notes:* + +- RESTRICTED repos will likely get fewer contributions due to the additional step to access the code. Where possible, INTERNAL repos should be preferred. +- It is possible to use a tool that automatically adds the `README.md` and some other metadata to an internal repository in GitHub, allowing the GitHub search feature to include this data in the search results. + +# Sketch + +``` +Example Repository Sharing Levels + + +┌──────┐ +│PUBLIC│ ───► open source: accessible for all software developers in the world +└──────┘ + +┌──────┐ +│SHARED│ ───► inner source: accessible for all software developers in the organization +└──────┘ + +┌──────┐ +│CLOSED│ ───► closed source: only accessible to named individuals in the organization +└──────┘ +``` + +# Resulting Context + +InnerSource adoption in an organization will often [start as an experiment][start-as-an-experiment], with a small number of SHARED repositories. + +If the task force (and with that Security and Legal) collaborate in this early phase already, they can make joint experiences with how security-related issues can be identified and addressed. This also allows the Security Teams to build up more confidence on InnerSource from a security angle. + +The defined sharing levels for repositories provide guidance on what sharing level to use for what type of repository content. The increased security awareness of the engineers and more secure setup of the source code management systems increases overall software development security. + +With the increased confidence and lessons learned from this experiment, the task force faces less pushback when rolling out InnerSource to more repositories. + +Most importantly, the changes implemented through this pattern lead to more code being shared between teams, and closed source will no longer be the obvious default. + +# Known Instances + +* Philips +* Verizon + +# Status + +- Initial + +# Authors + +- Bart Golsteijn +- Jack Yang +- Sebastian Spier + +# Acknowledgements + +- Conley Rogers + +# Alias + +- Secure Discoverability +- Secure Code Sharing +- Secure InnerSource + +# Notes (internal) + +*These notes are meant for internal use within the InnerSource Commons Patterns Working Group only.* + +To level up this pattern to a higher maturity level, please consider the following modifications: + +- adding short descriptions of the way that the orgs in the Known Instances are using this pattern +- identify further Known Instances + - e.g. RBC - for reference see [Making InnerSource & Developer Experience Real at one of Canada's Top 5 Banks](https://www.youtube.com/watch?v=QbJ4VFk8DwA) - by Anthony Vacca +- creating a Sketch that supports the main focus of this pattern (the current ASCII Diagram with the "Example Repository Sharing Levels" is mostly a placeholder) +- The current Story section isn't really a story. Consider working this into the Problem section, and using a story that some of the Known Instances (orgs) can share. +- Possibly renaming the pattern, if the extended content of this pattern makes that a new title more suitable. + +[principle-of-least-privilege]: https://en.wikipedia.org/wiki/Principle_of_least_privilege +[single-sign-on]: https://en.wikipedia.org/wiki/Single_sign-on +[export-control]: https://en.wikipedia.org/wiki/Export_control +[innersource-portal]: ../2-structured/innersource-portal.md +[start-as-an-experiment]: ../2-structured/start-as-experiment.md diff --git a/patterns/1-initial/concept-anchor.md b/patterns/1-initial/concept-anchor.md index d20153d5a..47cbef5e1 100644 --- a/patterns/1-initial/concept-anchor.md +++ b/patterns/1-initial/concept-anchor.md @@ -34,14 +34,27 @@ These are ideas for solutions to the problem that have not been tested yet. This There are several approaches that can be taken in the context of Agile depending on who's listening. The following main concepts are from [Wikipedia](https://en.wikipedia.org/wiki/Agile_software_development) -* *Incremental and evolutionary processes* - Submitting pull requests for early feedback, or creating an issue for early stakeholder discussion aids this process, allowing ideas to be shaped and defined in the very early conceptual stages, thus being able to nourish good ideas and filter out unfeasible ideas before there are any significant costs associated with them. -* *Efficient and face-to-face communication* - Many enterprises still implement collaboration models centered around face to face collaboration with teams being colocated. It is possible that management may view the "If it isn't written down and announced on the mailing list, it didn't happen" cultural norm of IS as unnecessary. For IS to work, having communications written down is crucial. +* _Incremental and evolutionary processes_ - Submitting pull requests for early feedback, or creating an issue for early stakeholder discussion aids this process, allowing ideas to be shaped and defined in the very early conceptual stages, thus being able to nourish good ideas and filter out unfeasible ideas before there are any significant costs associated with them. +* _Efficient and face-to-face communication_ - Many enterprises still implement collaboration models centered around face to face collaboration with teams being colocated. It is possible that management may view the "If it isn't written down and announced on the mailing list, it didn't happen" cultural norm of IS as unnecessary. For IS to work, having communications written down is crucial. One can highlight benefits to corporations from implementing IS practices. a) Business continuity in managing "Key man risk" When key people depart, the knowledge does not go out of the door with them. Robust documentation including decision records/RFCs and the like capture the rationale for important project design decisions and are key to continued productivity of new employees within the scrum team. b) Fostering productivity While the corporation's strategy may involve colocating employees who collaborate with each other regularly, it may still be a global corporation. Robust CI/CD and documentation facilitates collaboration and productivity across time zones and geographical locations. It eliminates barriers between teams and the production environment. -* *Quality Focus* this is a major point for IS. Because of the expected submission by a variety of teams and individuals, extra care is taken to make sure that the submitted code is screened to be production quality. Comprehensive documentation for submitters, test coverage, CI/CD, static code analysis and other techniques are often used to screen code from strangers in the open source world, these techniques have great benefits for internal teams. +* _Quality Focus_ this is a major point for IS. Because of the expected submission by a variety of teams and individuals, extra care is taken to make sure that the submitted code is screened to be production quality. Comprehensive documentation for submitters, test coverage, CI/CD, static code analysis and other techniques are often used to screen code from strangers in the open source world, these techniques have great benefits for internal teams. + +#### [Modern Agile](https://modernagile.org) + +The four principles of "Modern Agile" can be connected easily to the goals of InnerSource practices. + +For example: + +* **Make People Awesome**: A significant advantage of InnerSource is to promote team collaboration. The collaboration process positively exposes people, allowing everyone to know their contributions, thus encouraging them to contribute more and get recognized for it. +* **Make Safety A Prerequisite**: Open and transparent collaboration promoted by InnerSource is a great way to encourage and demonstrate that collaboration is discussed respectfully and aimed at promoting learning. +* **Experiment & Learn Rapidly**: Experimentation and learning are in the essence of the open source model and naturally are a fundamental part of the InnerSource. Fast development, good documentation, code reuse, and team collaboration promote experimentation and quick learning. +* **Deliver Value Continuously**: This is a consequence of the three previous principles, and all the InnerSource work philosophy supports it. + +_Note: The above is just an illustration of how to explain this connection. It is by no means the only way to tie these two concepts together._ #### [SCRUM](https://en.wikipedia.org/wiki/Scrum_%28software_development%29) diff --git a/patterns/1-initial/crossing-chasm.md b/patterns/1-initial/crossing-chasm.md new file mode 100644 index 000000000..5970378bc --- /dev/null +++ b/patterns/1-initial/crossing-chasm.md @@ -0,0 +1,118 @@ +## Title + +Crossing the InnerSource Chasm + +## Patlet + +Early InnerSource experiments have been successful. Methods that were successful +convincing early teams stop working though when scaling the initiative. This +chasm can be crossed by using different methods to reach people at different +stages of the innovation curve. + +## Problem + +Often InnerSource programs [start as experiments](../2-structured/start-as-experiment.md). From there +reaching early adopters and visionaries typically is easy. However the methods +used to reach these innovation friendly associates typically stop working when +trying to scale the initiative to pragmatists, conservatives or even sceptics. +As a result scaling stalls and the entire initiative cannot live up to its +potential. + +## Context + +A corporation with teams on a wide spectrum of innovation friendliness has +stared an InnerSource initiative. Goals are set, early experiments were +successful, some teams are successfully using the new collaboration best +practices. + +However there are teams which are less innovation friendly. Maybe they are more +risk averse than others. Maybe they prefer stable processes so they can focus on +their daily engineering challenges. Maybe they prefer to follow a proven path +instead of running into all of the hurdles that early adopters run into. + +## Forces + +- The goal is to increase collaboration, reduce duplication, increase knowledge + sharing. +- Some teams already adopted a lot of InnerSource best practices, often when + doing so they had to fix hurdles within the organisation when adopting a more +collaborative way of working. +- Some associates refuse to invest time in experimenting with new ways of + working, preferring a stable environment. +- There is too much time to get everyone on board individually. +- Depending on where associates are on the innovation curve they are willing to + invest different amounts of time to master a new way of working. + +## Solution + +The [InnerSource guidance group](../1-initial/innersource-guidance-group.md) should make different offers for +mastering InnerSource depending on where on the innovation scale employees are: + +### Steps for reaching innovators + +* Meet with people in person, in 1-on-1 settings, choose those in favour and +those against and those interested in the topic to create a first network. +* Start with InnerSource pilots. +* Create a community of practice that operates according to the principles that +you want to establish. +* Bring innovators together so they can support each other. +* Write down everything that you discuss in person or in calls so others that +lack the time to join those calls can follow along, provide their input and you +have a document that you can share with individuals following your trail. + +Write down solutions to any problems you find along the way and share those +written solutions with people following your trail. + +### Steps for reaching early adopters/ visionaries + +* Share results and learnings form retrospectives of InnerSource pilots. +* Share external material (bonus points if that is material that colleagues +created earlier: talks, blog articles, book chapters, magazine articles, videos +etc.) +* Co-create a document of shared [InnerSource Principles](../2-structured/document-your-guiding-principles.md). + +### Steps for pragmatists + +* Offer in-house and online training. +* Establish local experts on topics in the teams you want to reach. +* Provide an InnerSource strategy that is backed by higher level management. +* Provide InnerSource cheat sheet in particular for those new to the company. +* Provide teams with a self check to scale the initiative (see [Maturity Model](../2-structured/maturity-model.md). + +### Steps for reaching conservatives + +* Include InnerSource training material in mandatory training courses for new +hires. +* Integrate any tooling and any experiments you have run into established +company structures (e.g. GitHub/ GitLab instances are under a regular plan, +accounts are easy to create and integrated with e.g. corporate single sign-on +solutions, in-house support can provide help for these tools). +* Provide low effort opportunities for learning (e.g. put little riddles in your +coffee kitchen or whatever the digital alternative is for your company.) +* Ship bite sized learning pieces to inboxes. +* Pull in external expertise - sometimes in-house expertise counts much less +than external statements. + +### Steps for laggards + +* Incorporate InnerSource into career competencies description. + +## Resulting Context + +* The InnerSource initiative can reach teams with various innovation +preferences. +* Overall InnerSource adoption improves. +* Friction between teams decreases due to a common understanding. + +## Known Instances + +TBD + +## Status + +Initial + +## References + +- Book: [Crossing the Chasm](https://www.goodreads.com/book/show/61329.Crossing_the_Chasm) - Geoffrey A. Moore, Regis McKenna +- [Making InnerSource & Developer Experience Real at one of Canada's Top 5 Banks](https://youtu.be/QbJ4VFk8DwA?t=549) - GitHub Universe 2021 - Anthony Vacca diff --git a/patterns/1-initial/governance-levels.md b/patterns/1-initial/governance-levels.md index a48d2e1ff..5b65d11a1 100644 --- a/patterns/1-initial/governance-levels.md +++ b/patterns/1-initial/governance-levels.md @@ -2,75 +2,96 @@ Transparent Governance Levels -## Context +## Patlet + +Several teams are using different InnerSource patterns and all calling it "InnerSource", so the term is not precise enough to usefully describe a set of working practices without confusion. -Several teams are using InnerSource patterns and best practices. However the -degree to which they welcome not only contributions but give equal collaboration -rights to contributors differ. As a result there are unmatched expectations, -confusion and frustration when teams collaborate across team boundaries. +Estabilishing a more accurate common language that is understood across all teams allows anyone to communicate intent or set expectations efficiently without ambiguity. ## Problem -For two projects InnerSource best practices have been adopted. Project A -has a shared ownership model with [Trusted Committers](../2-structured/trusted-committer.md) from multiple teams. -Project B is fully owned by one team, only contributions are coming from -multiple teams. New contributors to either project are regularly confused about -the level of influence they can gain to the respective project. This leads to -long discussions, escalations and time lost on clarifications. +Several teams are using InnerSource practices. However the degree to which they welcome contributions and give equal collaboration rights to contributors differ. Despite these differences, all teams refer to their way of working as "InnerSource" without any additional qualifiers. + +The result is confusion and frustration when teams collaborate as the expectation of what InnerSource means in practice is different in each team. This confusion also affects strategy planning and decisions on future InnerSource intent as the term is too vague which leads to long discussions and time lost on clarifications. + +## Stories + +### Example of Confusion + +For two projects InnerSource best practices have been adopted. Project A has a shared ownership model with [Trusted Committers](../2-structured/trusted-committer.md) from multiple teams. Project B is fully owned by one team with contributions from other teams. New users of either project are regularly confused about the level of influence they can gain in the respective project. This leads to long discussions, escalations and time lost on clarifications. + +### Example of Delayed Decision + +Project C is currently closed source and used only by team 1. Team 2 want to use project C and the leadership of the two teams negotiates options which include InnerSource practices. Agreement takes longer than expected because the "InnerSource" term did not describe a target state that could be agreed without ambiguity, and the teams had to document bespoke options for their leadership to consider before a decision could be made. + +### Examples from Open Source + +Like "InnerSource", Open Source is also a broad term. + +There are projects on GitHub, published purely for the pleasure of the author with no intention of long term maintenance, not intention to fix bugs submitted by users. This would be the equivalent of "Bug Reports and Issues Welcome" - you can report the bug, but its on the owner to find the time to fix it. + +There are projects where the roadmap is created in-house, hidden from public view. Where commit rights come and go with the contract of the employees of one company (e.g. MongoDB, Elastic, Tensorflow). Users are welcome to submit patches, they will even be mentored through. All development happens in the open, but control and strategy is never shared. This would be the equivalent of stage "Contributions Welcome". + +There are projects that share write access, but do not share the power to decide who gets write access next. This applies to everyone who is only a committer at an Apache project. There are projects that are fully shared across multiple independent organisations (e.g. k8s, any Apache project) - those would be "Shared Ownership". + +The same levels make sense inside of organisations. + +## Context + +- InnerSource concepts are established within an organisation with multiple projects and teams adopting InnerSource. +- Internal InnerSource practices are not prescribed in detail. +- Teams/projects have the autonomy to optimise for their local circumstances. ## Forces -- For project A shared ownership works well, members coming from multiple teams - are working together. -- For project B the backing team would like to retain a certain level of - ownership and control. Sharing ownership with other Trusted Committers outside - of the original team is not an option. -- Contributors want clarity on the level of influence they can gain in an - InnerSource project they are involved with. -- Writing detailed guidelines into each contributions file leads to a lot of - text that is hard to understand for engineers. +- Projects adopt different InnerSource patterns and practices to optimise for their context. +- Users want clarity on the level of influence they can gain in an InnerSource project when deciding whether or how to use it. +- Leaders want clarity on InnerSource project intentions to understand the expected cost and benefits. +- Writing a detailed description of a set of InnerSource practices requires significant effort. ## Solution -Establish standardised building blocks which can be used by projects to signify -how much influence they are willing to share. Those building blocks can then be -used in contributing files. +The solution is to create a universally understood language to describe the InnerSource operating models that are used in your organisation. + +We define **InnerSource operating model** as a description of how much influence the core development team of a project ist willing to share with contributing teams. Or in other terms, the level of influence a contributing team can gain in the respective project. -Examples of building blocks: +The shared language for these InnerSource operating models can be established with these steps: -* **Bug reports and issues welcome**: People outside the core development team are - welcome to read the code. They can submit feature requests and bug reports for - things they would like to see changed. +1. Identify the common recurring InnerSource operating models that exist in your teams and projects. +2. Document each model in detail, and give each a distinctive name. +3. Promote the use of these names to describe projects until the name's meaning is understood across the whole organisation. -* **Contributions welcome**: People outside the core development team may use the - code, make modifications and feed those modifications back into the projects. - Trusted committers are willing to mentor those contributions to a state where - they can be accepted or communicate clearly why the proposed change cannot be - made. +Examples of common InnerSource operating models (1) are: -* **Shared write access**: In addition to the above people outside the core - development team may gain write access to the source repository. Influence on - roadmap decisions as well as influence on who else gains write access is - restricted to the core development team. +- **Bug Reports and Issues Welcome**: People outside the core development team may use the code. They can submit feature requests and bug reports for things they would like to see changed. +- **Contributions Welcome**: People outside the core development team may use the code. They can also make modifications and submit them to core team for inclusion. +- **Shared Ownership**: Members of different teams collaborate on the project as equal peers. Everyone has the ability to merge code. Everyone has an equal say on the project direction. Everyone has an equal say in who else to add to this group. -* **Shared ownership**: Members of different teams collaborate on the project as - equal peers. Everyone has the ability to merge code. Everyone has an equal say - on the project direction. Everyone has an equal say in who else to add to this - group. +Examples of promoting the model names (3) are: + +- Using the names within project documentation and contributing guides (see also [Standard Base Documentation](../2-structured/project-setup/base-documentation.md)). +- Labelling projects with the names in an [InnerSource Portal](../2-structured/innersource-portal.md). +- Presenting the names as a menu of adoption options for new InnerSource projects. +- Including the names and models in any internal InnerSource training or promotion. ## Resulting Context -Teams can adopt InnerSource best practices in a step-by-step way. By documenting -individual steps contributor confusion is avoided. +- Cross team communication occurs efficiently without confusion using terms that are universally understood and centrally documented. +- Organisation leaders understand the nuances within practising InnerSource and make better informed and more precise decisions that are easier to communicate. +- Increased standardisation of InnerSource practices within the organisation as the named and documented building blocks are used by teams as a menu for adoption. +- Teams can adopt InnerSource best practices in a step-by-step way which makes adoption easier and less intimidating. ## Known Instances -TBD +![InnerSource Pyramid used by Flutter Entertainment](../../assets/img/flutter-pyramid.svg) + +Flutter Entertainment define an [InnerSource Pyramid](https://innersource.flutter.com/how/) to describe 3 different InnerSource operating models: Readable Source, Guest Contributions and Maintainers in Multiple Teams. Each name is centrally documented. The use of these names is encouraged via repeated usage, direct training and categorisation of each InnerSource project. ## Status -Initial (Early draft) +Structured ## Authors -* Isabel Drost-Fromm +- Isabel Drost-Fromm +- Rob Tuley diff --git a/patterns/1-initial/incubator-pipeline.md b/patterns/1-initial/incubator-pipeline.md new file mode 100644 index 000000000..557fbf639 --- /dev/null +++ b/patterns/1-initial/incubator-pipeline.md @@ -0,0 +1,88 @@ +## Title + +Incubator Pipeline + +## Patlet + +A team maintaining a widely shared code library wants to accept contributions from other teams, without lowering the overall quality of their library. Therefore the shared library team uses an incubator pipeline to set a lower bar for contributions to enter and a higher bar to exit and become a top-level unit in the library. + +## Problem + +A team charged to maintain a shared library is responsible for the quality of the components in the library. If you offer them code from another team, they face the dilemma that the other team’s code might not meet their requirements, and it’s unclear if they’ll be able to support that code. If other teams can’t offer code, they may be reluctant to use the shared code, or they may be forced to use inadequate code from the central team, causing issues for their product. + +The team managing the shared code library needs a way to allow InnerSource contributions to their supported library of components but also to distinguish between contributions that are up to the standard, or that are on their way to the standard. + +## Story + +See [Culture, Behaviors, and InnerSource. A three-part blog series. 3 of 3](https://www.linkedin.com/pulse/culture-behaviors-innersource-three-part-blog-series-3-gil-yehuda/) for the conceptual inspiration for this pattern. + +## Context + +We find the pattern to be useful when there’s a team at a company that is responsible for creating code assets that other engineering teams at the company must consume. For example: + +1. the team that creates the centrally approved library of UI components, +1. the team that builds the build pipelines and installation scripts, +1. the team that builds microservice template code, etc. + +These teams are held to meet certain standards (e.g., UI teams ensure all components comply with accessibility standards, can be themed and placed on the UI grid in a manner consistent with other components and company requirements; pipeline and install scripts might require certain boilerplate code for compliance logging or security controls, etc.). + +However, the shared code library team does not want engineers to “roll their own” solutions either. But the user-teams may have needs not met by the shared library team’s code. Since they are engineers, they’ll want to create or find their own solutions. Doing that threatens the shared library team and creates multiple solutions. Whereas that’s sometimes okay, in some cases companies want to use InnerSource to maintain consistency without stifling innovation. + +## Forces + +If the shared library team insists that they alone are the exclusive source of approved code, they limit the company output to the shared library team’s capacity. If the needs exceed the capacity, everyone suffers. However, if the shared library team cannot prevent other teams from creating their own solutions, they lose their role as a standards-setting team and simply become a team that provides technology that only some teams use. + +For the customers of the shared library team’s code, they too face a challenge. The library provided may be insufficient. They’ll need some other solution. But breaking rank will cause downstream tension when it comes time to merge their rogue code with the approved code. They want to follow the company protocols, but they also need to deploy their products. + +## Sketch (optional) + +None yet + +## Solutions + +The shared library team provides an incubator pipeline for their (internal engineering) customers to use. Customer teams who need to augment the shared library can do so by petitioning to enter the incubator pipeline. Additionally, central teams can request contributions into the incubator pipeline. The shared library team maintains an acceptance criterion to get into the pipeline. This may include some demonstration that at least one other team would find the contribution useful, that the contribution could (perhaps with some additional engineering work) be enhanced to conform to the shared library standard. **In other words, no code should enter the incubator pipeline that we know cannot exit it.** + +Once in the incubator pipeline, the shared library team and contributing teams can select a support agreement that enables teams to use the incubating code, but to understand that its support is less than a top-level component in the library. It is a second-class citizen that is on the way to becoming a first-class citizen. + +Exiting the incubator pipeline means the code is a first-class citizen and member of the shared library. In this case, the shared library team may not have created the code, and may not have enhanced the code. But they will be willing to support the code as if they created it because it meets the criteria they set for their own code. It is possible that a component fails to graduate the pipeline. In that case, the component would be retired out of the incubator pipeline. + +## Resulting Context + +When a customer-team needs code that the shared library team does not have, they have a path to success. They can create and propose a solution to be included in the incubator pipeline. (They might find an open source solution too.) This does not pose a threat to the shared library team. In fact, it allows the shared library team to grow their library at a faster rate while maintaining quality control by staging the contribution. + +Moreover, by defining an incubator process, the shared library team clarifies their criteria for inclusion into the library. This helps new members of their team too. In fact, this allows any engineer who can meet the criteria to become a "member of their team" even if only for a component or two. + +## Rationale + +Incubator pipelines allow participants to view code as potential and improving assets. Too often, people see code as being good enough or not good enough. In reality, code can become better. Formally putting code in an incubator status sends the message that the code is not yet good enough but is getting there. + +This pattern was inspired by things like the Apache Software Foundation's incubator, as well as Linux Foundation's sandbox/incubator processes used in CNCF, CDF, and other open source foundations. Those help entire projects get into the foundation. They help raise the bar on projects that wanted to get more visibility by getting them into an incubator. Many of those projects graduated and are very successful today, in open source. This pattern here is like a smaller fractal of that pattern -- to help components get into an open source library. + +## Known Instances + +Being implemented at U.S. Bank. + +## Status + +Initial + +## Author(s) + +* Bryn Sharpe +* Gil Yehuda + +## Acknowledgements + +* Kevin Bongers +* Anton Fernando +* Levi Geinert +* Travis Killoren +* Dave Lester +* Mike Lupo +* Logan Price +* Joseph Ryan +* Michael Schlies +* Michael Schulz +* John Sibo +* Jennifer Skov +* John Yopp diff --git a/patterns/1-initial/innersource-customer-interview-questions.md b/patterns/1-initial/innersource-customer-interview-questions.md new file mode 100644 index 000000000..1ff5f9c3e --- /dev/null +++ b/patterns/1-initial/innersource-customer-interview-questions.md @@ -0,0 +1,76 @@ +## Title + +InnerSource Customer Interview Questions + +## Patlet + +An organization has decided to create an InnerSource program but are unsure which issues they should address first. +Using a customer interview will help evaluate pain points across the organization, to prioritize the areas where InnerSource will have the biggest positive impact. + +## Problem + +InnerSource can address a number of areas that impact collaboration. The problem is: + +* Determining what organizational pain points to address first. People want every pain point that InnerSource can address, solved fast. +* Evaluating team needs can be ambiguous if the conversation is not structured around an InnerSource framework. + +## Context + +Organizations know what problems InnerSource can help address and that their organization will benefit, but don’t know what to do first. Introducing the idea of InnerSource to teams across an engineering organization can result in many excited team leaders who want the final results, but organizations still need solid buy-in and a way to communicate the amount of time and effort a solution will take. People like the idea, but people starting an InnerSource program need a way to find advocates, engage users, understand their needs, and show them how InnerSource will directly impact their teams. + +## Forces + +Constraints: + +People are busy and want a fast solution. They like an idea, but don’t understand how they will have to participate in the solution. + +There are limited resources and some solutions may already exist, but they are only known about by a small group of people. + +People do not understand how they are directly affected by InnerSource or how to get involved. + +## Solutions + +Create a customer interview to evaluate team needs and convey to your user what InnerSource can address by using questions specifically structured around the InnerSource framework. Some questions on this list may seem redundant, but they help users to look at problems from different perspectives. + +**InnerSource Customer Interview Questions** + +* **Documentation** + * What are your challenges related to documentation? + * How do you find documentation created by another team? +* **Collaboration/Communication** + * What are your challenges related to cross team collaboration? + * What would make your daily collaboration with other teams easier? +* **Bottlenecks** + * What creates the most bottlenecks on your team? + * What are some bottlenecks that aren’t on your team but cause you problems? +* **Project Governance** + * What happens when your team has conflicting equally important priorities? (These may be equally important, time critical PRs from two other teams) + * How are decisions on your team made? +* **Contribution** + * What are the biggest barriers to entry for other internal teams to contribute to your project? +* **Transparency** + * What current processes or challenges limit your project transparency? +* **Processes** + * What new processes would make your team more successful? This is any process you may want if there were no limitations. What processes or structures do you wish were in place? + * Are there any current processes in place that hinder performance? +* **Who else should we be talking to?** + +## Resulting Context + +After reaching out to team leaders and finding out what their needs are, showing how they will be impacted by an InnerSource program, and conveying how sharing their struggles with help contribute to the effort, you will have greater buy-in to InnerSource. People will see it as action instead of concept and you will have data that will help create a plan. You will be able to create a report of the most common pain points across the organization that can be shared with leadership to show user needs and clear goals for next steps. + +Working through these questions helps build trust and establish relationships with users. It helps contextualize InnerSource and how it applies to their individual teams. Building these relationships helps evaluate users and their teams for InnerSource readiness. Discussing these questions helps frame the benefits of InnerSource in a way that users can understand without making it a sales pitch. + +By using this pattern you will gain information that will help you to describe your [goals and guiding principles](../2-structured/document-your-guiding-principles.md), build a plan, and identify [good first project](../1-initial/good-first-project.md) to start with. + +## Known Instances + +* Indeed - see reference [InnerSource Sleuth: Identifying Your Pain Points - Katie Schueths (Indeed) - IS Summit 2022](https://www.youtube.com/watch?v=Et7-DzdY2yw) + +## Status + +Initial + +## Author(s) + +Katie Schueths (Indeed) diff --git a/patterns/1-initial/introducing-metrics-in-innersource.md b/patterns/1-initial/introducing-metrics-in-innersource.md index a17095fca..54410bf2f 100644 --- a/patterns/1-initial/introducing-metrics-in-innersource.md +++ b/patterns/1-initial/introducing-metrics-in-innersource.md @@ -62,8 +62,8 @@ The list below consolidates some metrics candidates, grouped by business goals. | Knowledge sharing | # of clone or forks from external guests
# of visits from external guests | | Creating reusable software | # of submodule usage
# of code reuse across projects
# of clone or forks from external guests | | Increase development speed | Time to market
Mean-time-to-review | -| Employee satisfaction & talent retention | | -| Improve quality | # of automated test runs on PRs
# of issues created from external contributors | +| Employee satisfaction & talent retention | eNPS score
attrition rate | +| Improve quality | # of automated test runs on PRs
# of issues created from external contributors
Rework rate | | Innovation | | | Others | # of repositories using InnerSource components (managed contributing guidelines, assigned TCs)
Days of host's responsiveness on the issues/PRs created by external contributors | diff --git a/patterns/1-initial/modular-code.md b/patterns/1-initial/modular-code.md index ee581a11f..2d29a692e 100644 --- a/patterns/1-initial/modular-code.md +++ b/patterns/1-initial/modular-code.md @@ -4,11 +4,11 @@ Modular Code ## Patlet -TBD +The lack of modularization in the software architecture prevents reuseability, and with that the ability to reap the benefits of InnerSource. By helping the teams to understand the benefits of modularization, and making time to work towards that goal, more InnerSource collaboration can happen and the software architecture overall can be improved. ## Problem -Development does not want to spend the extra resources needed to develop modular components. As a result, shared components are not reused. +Engineering does not want to spend the extra resources needed to develop modular components. This applies to managers and developers alike. As a result, fewer components end up being reused, leading to duplication of work. ## Context @@ -39,7 +39,7 @@ Development does not want to spend the extra resources needed to develop modular * Provide incentives to teams to invest in modular code. Modular code is far more reusable. This could work well for large teams when working on modularized projects; team members can focus on their smaller assigned tasks. - Developers could get an opportunity to increase their influence in the organization. - Modular code makes the pathway to open source smoother. - - Modular code facilitates division of labour (as required for work in larger teams, or as an Open Source project) + - Modular code facilitates division of labour (as required for work in larger teams, or as an open source project) - Modular projects enable team members to focus on their own smaller assigned tasks. - Modular code makes Agile implementation easier. - Modular efforts increase autonomy and accountability for Engineers, which can raise satisfaction and quality. diff --git a/patterns/1-initial/overcoming-project-management-time-pressures.md b/patterns/1-initial/overcoming-project-management-time-pressures.md index 29a844b53..fb5e88ce8 100644 --- a/patterns/1-initial/overcoming-project-management-time-pressures.md +++ b/patterns/1-initial/overcoming-project-management-time-pressures.md @@ -1,10 +1,10 @@ ## Title -Time Constraints Hamper Inner Source Progress +Time Constraints Hamper InnerSource Progress ## Patlet -TBD +Project management believes timeline pressure and commitments on feature content does not allow for developers to spend the time needed to develop shareable code and provide support. ## Problem @@ -16,26 +16,31 @@ Customer deadlines and delivery commitments for feature content do not change. ## Forces -- Aggressive roadmaps for delivery -- Project management concern that engagement will lead to missed deadlines -- Project management concern that Code contribution and/or mentoring may lead to dilution of subject matter expert time spent on their own projects (other teams may require their time). +❎ Aggressive roadmaps for delivery + +❎ Project management concern that engagement will lead to missed deadlines + +❎ Project management concern that Code contribution and/or mentoring may lead to dilution of subject matter expert time spent on their own projects (other teams may require their time). + +✔️ Elimination of rewriting common code saves time (write once, use many times) -+ Elimination of rewriting common code saves time (write once, use many times) -+ Crowd-based testing and debugging saves time (and improves quality) -+ The collaboration and synergy of inner sourcing can generate new, innovative features . -+ Test Driven Development could mitigate some of the above forces +✔️ Crowd-based testing and debugging saves time (and improves quality) + +✔️ The collaboration and synergy of inner sourcing can generate new, innovative features + +✔️ Test Driven Development could mitigate some of the above forces ## Solutions -- Known pattern: temporary fork by product team, merging changes back later to component team +- Known pattern: Temporary fork by product team, merging changes back later to component team - Known anti-pattern: surreptitious temporary fork, no communication - New Pattern: Pre-pull request (prior to release), to ensure component team has buy-in, to avoid breakage for temporary fork -- Allocate time into Development sprint/release schedules to allow for inner sourcing -- Provide education to product owners and Development leads regarding time saving benefits of Inner Source +- Allocate time into Development sprint/release schedules to allow for InnerSource +- Provide education to product owners and Development leads regarding time saving benefits of InnerSource ## Resulting Context -Time is allotted in the schedule for inner sourcing. Less duplicative development due to availability of reusable code. (No negative impact on customer deadlines or content delivery commitments.) +Time is allotted in the schedule for InnerSource. Less duplicative development due to availability of reusable code. (No negative impact on customer deadlines or content delivery commitments.) ## Known Instances @@ -52,3 +57,7 @@ TBD ## Status Initial + +## Alias + +Overcoming Project Management Time Pressures diff --git a/patterns/1-initial/share-your-code-to-get-more-done.md b/patterns/1-initial/share-your-code-to-get-more-done.md index a5a3419b1..d8cf0ad64 100644 --- a/patterns/1-initial/share-your-code-to-get-more-done.md +++ b/patterns/1-initial/share-your-code-to-get-more-done.md @@ -8,8 +8,8 @@ TBD ## Problem -* Developers do not realize that they can get more done by taking advantage of Inner Sourcing -* Developers continue to work in their silo or alone and never take the time invest in moving to Inner Sourcing +* Developers do not realize that they can get more done by taking advantage of InnerSource +* Developers continue to work in their silo or alone and never take the time invest in moving to InnerSource * Project Teams need a compelling reason to invest some time to make the change ## Context @@ -22,25 +22,25 @@ TBD ## Forces -* Developers have no extra time to shift to Inner Sourcing -* Management has not prioritized a shift to Inner Sourcing +* Developers have no extra time to shift to InnerSource +* Management has not prioritized a shift to InnerSource * Adding staff to get the work done using traditional methods is not possible -* The value of Inner Sourcing is not included in the project plan +* The value of InnerSource is not included in the project plan ## Sketch (optional) ## Solution -* Leverage existing case studies and collateral from Inner Source Commons to educate management on the value of investing in Inner Sourcing. -* Work with planning team to document an alternative project plan with some inner sourcing activities and estimated benefits from realistic expected participation -* Move the product code to an Inner Source compatible solution and open the code +* Leverage existing case studies and collateral from InnerSource Commons to educate management on the value of investing in InnerSource. +* Work with planning team to document an alternative project plan with some InnerSource activities and estimated benefits from realistic expected participation +* Move the product code to an InnerSource compatible solution and open the code * Assign a portion of the developers time to work as reviewers to ensure inner sourcing activities are successful * Recruit potential contributors and inform them of the availability of the opportunity to participate * Align incentives to participation for both existing developers and contributors to encourage behavior ## Resulting Context -* Development previously done in a silo is on the inner source system +* Development previously done in a silo is on the InnerSource system * People from outside the traditional silo are contributing successfully * More development is getting done per period (sprint) diff --git a/patterns/1-initial/source-code-inventory.md b/patterns/1-initial/source-code-inventory.md index 266104baa..87ee3e1c8 100644 --- a/patterns/1-initial/source-code-inventory.md +++ b/patterns/1-initial/source-code-inventory.md @@ -105,7 +105,7 @@ The Source Code Strategy Assessment Framework helps teams to understand the valu ## Author(s) * [David Terol](https://github.com/dterol23) -* [Simao Williams](mailto://me@simaos.net) +* [Simao Williams](mailto:me@simaos.net) ## Acknowledgements diff --git a/patterns/1-initial/transitioning-contractor-code-to-innersource-model.md b/patterns/1-initial/transitioning-contractor-code-to-innersource-model.md new file mode 100644 index 000000000..a29d77a54 --- /dev/null +++ b/patterns/1-initial/transitioning-contractor-code-to-innersource-model.md @@ -0,0 +1,83 @@ +## Title + +Transitioning Contractor Code to InnerSource Model + +## Patlet + +Contract developers are often not motivated to engage in InnerSource activities, which may be beyond the scope of their contract. This pattern describes how you can focus on transitioning the contractor project after the fact to an InnerSource project by setting expectations for specific InnerSource-related deliverables as part of the overall project delivery. + +## Problem + +Contractor developers are often not motivated (through forces described below) to not engage in InnerSource activities. Once delivered, and even if the code is made visible, their projects are often less likely to be part of successful InnerSourced engagements. + +## Context + +This problem exists where an organization either: + +- out-sources the development of a well defined project or +- engages external firms for staff augmentation and has mixed teams of permanent employees with a large percentage of contract staff. This issue may occur less often in a mixed team where InnerSource principles and ways of working are already established within the organization, but the forces described below are still often at play. + +## Forces + +Contractor Motivation and Constraints: + +- Contracts with third-party developers tend to be focused on delivering an end result in the fastest possible fashion. As a result, all InnerSource activities (e.g. responding to third-party PRs) are considered to be distractions or something that will “slow down” delivery. +- Concern that accepting code from other parts of the business might introduce security risks, scope creep or other issues that would subsequently have to be resolved by the contract team. +- Concern that accepting PRs from other parts of the company may “muddy the waters” when it comes to assessing what parts of the project were completed/delivered by the contracted developers. +- Contractors may have concerns about loss of control over the projects technical details if other teams are contributing significantly. +- Even when motivations align (a project can be completed faster or with higher quality by engaging in InnerSource) contractors might still be unclear if they can because it is not explicitly listed as allowed in the contract terms. + +All of the above can mean that even if an individual contract developer wants to engage in InnerSource, there are system-level constraints pushing them not to. + +It should be noted that the above scenario is indirectly impacted by: + +- The norms around defining Statements of Work for third party contractors +- Pressures to reduce contractor costs during procurement +- Ability to tie contributions to payment at a granular level. + +It could also be noted that the contractor motivations in this instance is almost like a more extreme instance of the often reported organizational/budgetary constraints that might exist for some internal business units. + +## Solutions + +At the outset of the project, clearly define: + +- That the code will be made visible by default to all developers within the organization. +- That the architecture of the code should be modular and ready for component reuse. +- How the project will be transitioned to an InnerSource project. This could be similar to a transition of ownership plan for an open source project which should include: + - Identification of new a maintainer team + - An announcement to stakeholders regarding the transition + - Written documentation describing functionality, architecture, and common processes like releasing, patching, deploying, testing, etc. + - A prescribed number of hours on the contract set aside for the contractor to meet with the identified long term maintainer (normally from the company who hired the contractor) for an overview of responsibilities and Q & A. + - (untested) A 30 day warranty pattern could be applied and so the contractor would provide 30 days of direct transition support to the new maintainers + +It is noted that this practice can work very well where there is a high trust relationship between the contracting team and the contractors. Perhaps they have worked closely together before, or have a pre-existing relationship. Further patterns that explore how to build trust between teams might enhance this pattern. + +## Resulting Context + +This particular pattern does not attempt to change the initial behavior of the contract development team (in terms of their potential lack of engagement with the InnerSource process). However, the end result is that the project does become part of the InnerSourced projects for the company after the fact. + +## Known Instances + +* **GitHub** has seen this approach work with their US government agency customers. + +## Status + +Initial + +## Author(s) + +- Clare Dillon +- Zack Koppert + +## Acknowledgements + +Particular thanks to Zack Koppert for sharing his experiences in this area and to Gil Yehuda for raising the issue in the InnerSource Slack channel. + +This pattern was extracted from a conversation on the topic held with the following folks: + +- Brittany Istenes +- Clare Dillon +- Cristina Coffey +- Derek Murawsky +- Gil Yehuda +- Zack Koppert diff --git a/patterns/2-structured/30-day-warranty.md b/patterns/2-structured/30-day-warranty.md index dcea720f3..b1a37d172 100644 --- a/patterns/2-structured/30-day-warranty.md +++ b/patterns/2-structured/30-day-warranty.md @@ -18,10 +18,10 @@ A team develops a component which is used throughout an organization. This team ## Forces - There is distrust of contributions due to a past history of cheating: teams submitted half finished contributions and subsequently filed requests for fixes that make it ready for use in production. -- If code is contributed from outside the team, the team has the natural suspicion that the other team does not know how to write code that would meet the teams expectations. +- If code is contributed from outside the team, the team has the natural suspicion that the other team does not know how to write code that would meet the receiving team's expectations. - Each team looks first to help its own leaders achieve their own goals. This direction of loyalty can complicate resolution of this problem. - There is a natural aversion to taking responsibility for code not written by oneself. -- Contributed needs to be heavily rewritten before being accepted into the codebase. +- Contributed code needs to be heavily rewritten before being accepted into the codebase. - There is the fear of the contributors not being available for support with fixing bugs after the time on contribution. - Teams fear contributed code will lead to high(er) maintenance costs but do not know how to control for that. - Receiving teams may fear that teaching others how to contribute code will expose technical debt in their system and that visibility may be damaging. @@ -36,7 +36,7 @@ Note that the warranty period could be 45, 60, or 100 days too. The duration may In addition it helps to provide clear [contribution guidelines](./project-setup/base-documentation.md), spelling out the expectations of the receiving team and the contributing team. -30 Day Warranty +![30 Day Warranty](../../assets/img/thirtydaywarranty.jpg) ## Resulting Context @@ -46,7 +46,9 @@ In addition it helps to provide clear [contribution guidelines](./project-setup/ ## Known Instances -This was tried and proven successful at PayPal. +- This was tried and proven successful at PayPal. +- GitHub internally uses this pattern with a modified warranty timeline of 6 weeks. +- Microsoft recommends this pattern as a principle - teams set their own specific time target matching their needs and confidence. ## Authors diff --git a/patterns/2-structured/common-requirements.md b/patterns/2-structured/common-requirements.md index 79ff10b66..c13899b92 100644 --- a/patterns/2-structured/common-requirements.md +++ b/patterns/2-structured/common-requirements.md @@ -12,14 +12,21 @@ The common code in the shared repository isn't meeting the needs of all the proj ## Context -Many projects are trying to use common code. There is a shared repository that all the projects access. This pattern applies if there is a Strong Code Owner [pattern to be written] or if there is weak code ownership, or no Benevolent Sponsor [pattern to be written]. Someone (or some project) wrote the code in the first place and contributed it to the repository. The common code is a small percentage of the overall deliverable from any of the projects. Each project has its own delivery schedule, set of deliverables and customers. +* Many projects are trying to use common code. There is a shared repository that all the projects access. +* Someone (or some project) wrote the code in the first place and contributed it to the repository. +* The common code is a small percentage of the overall deliverable from any of the projects. +* Each project has its own delivery schedule, set of deliverables and customers. +* This pattern applies in either of these situations: + * there is a **Strong Code Owner** i.e. all changes to the shared repository have to be approved by the repo owner + * there is **weak code ownership** i.e. no one really owns the code + * there is **no Benevolent Sponsor** i.e. no organization or executive is providing resources to organize the common code in an InnerSource fashion ## Forces The project that made the code available has one set of needs. Its needs are similar to what some of the receiving organization wants, but not quite the same. Requirements on code should be derivable from real customer needs. -The needs of different customers are generally quite similar; however they might be expressed differently or weighted differently between customers. An example might be how some customers want some result presented in one way while others want it presented in the reverse order---it's simple to do the translation between them, but requires additional coding for one of the cases and the as a result the module that computes the result can't be reused by both customers. +The needs of different customers are generally quite similar; however they might be expressed differently or weighted differently between customers. An example might be how some customers want some result presented in one way while others want it presented in the reverse order. It is simple to do the translation between them, but requires additional coding for one of the cases and as a result the module that computes the result can't be reused by both customers. Many customers want the supplier to help them know what they need. The company has many “Systems Engineers” writing requirements for the products. These requirements are supposed to be a distillation of customer needs to guide development of the product. Reusing code is an important goal to save the company time and money. @@ -28,34 +35,40 @@ Reusing code is an important goal to save the company time and money. There are two aspects to solving this problem which should be done in parallel: -- Align the requirements of the projects so that the code that meets the requirements for one project also meets the needs for the other projects. -- Refactor the code into smaller pieces for which the many using projects can agree upon requirements. +1. Align the requirements of the projects so that the code that meets the requirements for one project also meets the needs for the other projects. +2. Refactor the code into smaller pieces for which the many using projects can agree upon requirements. Additionally, take advantage of customers expecting the supplier to help elucidate requirements. Bring about the alignment of requirements during the customer negotiations and influence the customers requirements rather than changing the component. In the example presented above, the supplier helps both customers realize that they want the same thing, and it will save everyone effort (and money) if they agree to accept the result in the same format. -Common Requirements +![Common Requirements](../../assets/img/CommonReqtsv2.jpg) ## Resulting Context This might require negotiating requirements changes with the customer. The changes might also require involvement by the sales teams and product managers to get alignment on the requirements. The customer might need incentives, such as discounts, to agree to the changes. -A related pattern [pattern to be written] is a circular story-writing exercise reported at one company employing InnerSource. +A related challenge (and possible new pattern) is a circular story-writing exercise reported at one company employing InnerSource. In short: * The developers write a story to solve a problem in one way. * The program managers rewrite the story to better express their needs - keeping the essence the same. By the time it returns to developers though they don't recognize it as what they wanted to do in the first place and so balk at implementing it. -* The solution to this pattern is to have more seats around the planning table so that story modifications are understood across the project not just in the developer or program manager camps. +* The solution to this pattern is to have more seats around the planning table so that story modifications are understood across the project, not just in the developer or program manager camps. ## Known Instances -TBD +* Large telecom provider ## Status * Structured -* Drafted Aug 2016 ## Author Robert Hanmer + +## Acknowledgements + +* Manrique Lopez +* Daniel Izquierdo +* Tim Yao +* Sebastian Spier diff --git a/patterns/2-structured/contracted-contributor.md b/patterns/2-structured/contracted-contributor.md index 8b37b2441..d36043fc3 100644 --- a/patterns/2-structured/contracted-contributor.md +++ b/patterns/2-structured/contracted-contributor.md @@ -64,7 +64,7 @@ time. - The governance office offers to mediate between the contributor and her line manager in case of conflict regarding the time for contributions. - The [Dedicated Community Leader](dedicated-community-leader.md) participates in or provides input for performance reviews of contributors contracted for more than 20 %. -Contracted Contributor +![Contracted Contributor](../../assets/img/contracted-contributor.png) ## Resulting Context diff --git a/patterns/2-structured/core-team.md b/patterns/2-structured/core-team.md index 67d13820a..af9b2bc4e 100644 --- a/patterns/2-structured/core-team.md +++ b/patterns/2-structured/core-team.md @@ -95,7 +95,8 @@ The core team fills those gaps and greases the wheels so that the contribution e ## Known Instances -Nike implemented this pattern to manage the InnerSource effort around its reusable CI/CD pipelines. +* **Nike** implemented this pattern to manage the InnerSource effort around its reusable CI/CD pipelines. +* **WellSky** established a Core Team for a key project. This allowed them to scale their InnerSource contributions to that project significantly - see [Wide-Scaled InnerSource with a Core Team](https://www.youtube.com/watch?v=kgxexjYdhIc). ## Status diff --git a/patterns/2-structured/crossteam-project-valuation.md b/patterns/2-structured/crossteam-project-valuation.md index bc0cbe12f..1fede7cc2 100644 --- a/patterns/2-structured/crossteam-project-valuation.md +++ b/patterns/2-structured/crossteam-project-valuation.md @@ -46,7 +46,7 @@ Using that team of experts, estimate 4 things about each consumer of your projec When making these estimations, it's impossible to know with high accuracy _exactly_ how long any activities take. That's not your goal. Rather than exactness, you should strive to _**set a worst-case bound**_ on these estimates. The idea is for the group of experts to be able to say to each other, "We don't know exactly how long it would take, but we can all agree it's _at least_ this much." -Specifically, you should estimate a *maximum* reasonable time to consume your project output and *minimum* reasonable times for consumers to otherwise home-roll, use and maintain their own solutions. +Specifically, you should estimate a _maximum_ reasonable time to consume your project output and _minimum_ reasonable times for consumers to otherwise home-roll, use and maintain their own solutions. One note about cost of "rolling your own solution" (home-roll). The cost to home-roll a solution is NOT necessarily (very unlikely, in fact) the same as the cost of making a shared solution. Oftentimes for the same functionality the modularity and quality involved in building a cross-team, shared solution makes it a noticeably higher investment than a quick, hardcoded implementation used just once. diff --git a/patterns/2-structured/dedicated-community-leader.md b/patterns/2-structured/dedicated-community-leader.md index ee8ae549f..00ed71373 100644 --- a/patterns/2-structured/dedicated-community-leader.md +++ b/patterns/2-structured/dedicated-community-leader.md @@ -8,7 +8,7 @@ Select people with both communications and technical skills to lead the communit ## Problem -How do you ensure that a new InnerSource initiative has the right [community leader](http://www.artofcommunityonline.org/) to grow it's impact? +How do you ensure that a new InnerSource initiative has the right [community leader](http://www.artofcommunityonline.org/) to grow its impact? Selecting the wrong persons and/or not providing enough capacity for them risks wasted effort and ultimately the failure of a new InnerSource initiative. diff --git a/patterns/2-structured/document-your-guiding-principles.md b/patterns/2-structured/document-your-guiding-principles.md index 63b1efa2d..160d43434 100644 --- a/patterns/2-structured/document-your-guiding-principles.md +++ b/patterns/2-structured/document-your-guiding-principles.md @@ -39,7 +39,12 @@ as well as a clear path towards achieving these goals. Those driving the InnerSource initiative in the organisation need to help the teams and individuals that are lacking a deep background in open source, and therefore have a less intuitive understanding of InnerSource. -Clarity should be provided around these two areas: +Clarity should be provided to teams and individuals by documenting these two areas: + +1. **Purpose** - Why does the organisation want to adopt InnerSource? +2. **Principles** - Which InnerSource principles will help to address these challenges? + +The following sections provide more details about both of these, meant as possible starting points to document them for your organization. ### Why does the organisation want to adopt InnerSource? @@ -90,9 +95,9 @@ For that, potential future contributors need to be able to follow the project pr If project relevant communication happens through synchronous communication, arguments discussed need to be made transparent in the written channel - decisions should be finalized only there. As a side effect this leads to passive base documentation that is very valuable for any newcomer to the project. -(5) Allow written advise to accumulate in a persistent, searchable archive +(5) Allow written advice to accumulate in a persistent, searchable archive -All project communication, in particular decisions taken and discussions leading up to those decisions need to be archived. +All project communication, in particular decisions taken and discussions leading up to those decisions, need to be archived. It must be possible to reference communication via stable URLs. Previous communication needs to be stored in a way that can easily be searched. @@ -111,7 +116,7 @@ All Trusted Committers of a project are published. * Organisation members understand which challenges they can address by applying InnerSource best practices. * Organisation members lacking prior open source experience understand the basic values and principles of InnerSource projects. -* Organisation members lacking prior open source experience are able to check their daily doing against a set of common established values. +* Organisation members lacking prior open source experience are able to check their daily activities against a set of common established values. * The organisation's development practices become more similar to open source projects thus making it easier for organisation members to participate in open source projects. ## Known Instances @@ -121,10 +126,60 @@ All Trusted Committers of a project are published. The InnerSource principles listed in the Solution above are mostly based on Europace's experience. For more details see [Europace InnerSource Prinzipien](https://tech.europace.de/post/europace-inner-source-prinzipien/) (in German). +### GitHub + +#### Purpose + +Often at GitHub we work in a model where teams contribute features to areas outside their area of responsibility. Common examples include sales engineering contributing features to unblock a sale, Special Projects contributing urgently needed, high impact features across the product, and a team working across multiple areas to deliver a feature. + +#### Principles + +Overall the principles outlined in this doc are to avoid increasing tech debt and support burden for the owning team. Oftentimes help is being lent to a team because they are behind due to support and maintenance costs in their area of responsibility and they do not have bandwidth to contribute to the feature. Any new features done by another team that add to that support burden or tech debt means even less time for the owning team to work on new features, so we want to make sure they are done right. + +At the same time, we strive to be a company where engineers freely work across boundaries, and business priorities often require that we contribute to areas outside our core areas of ownership. + +A good summary of the principles is to leave the area in as good as or better shape than you found it. + +With that in mind, here are principles we agree on: + +- Avoid minimum viable products (MVP) that accrue feature debt. It is ok to ship an MVP to get customer feedback, but the contributing team must be committed to finishing the feature set. Examples include: + - Commitment to go beyond MVP to a solution that will satisfy most customers. + - Full support for administration of new features (e.g. support in the settings UI vs. just doing a command line). + - Surface features in both the UI and API vs. only deliver an API (or vice versa) + - Ensuring features work in cloud and local server environments. +- Support the feature work up to and beyond its deployment to production + - Coordinate incremental rollout + - Handle support tickets + - Plan time to address customer feedback (features and bugs) +- Build features in the right way (do not accrue tech debt) + - Agree on requirements and solution with Product and Engineering teams + - Proper architecture and design + - Make sure data is stored properly to avoid later data migrations. + - Appropriate telemetry is in place + - Appropriate test coverage is in place + - Supported on cloud and local production environments (including setup, configuration, backup / restore, migrations, etc.) + - Bugs fixed + - Documentation updated + +#### Engagement + +We use an engagement model because we like to lay out what concrete steps can be taken by a team when contributing features to areas outside their area of responsibility. + +A typical engagement model at GitHub looks like this: + +- Get approval on the feature set and rollout plan from the product owner. +- Get approval on engineering design, including addressing the non-functional requirements (telemetry, test coverage, multi-environment testing and support) from the engineering owner (typically engineering manager and director). +- Do code reviews along the way, along with reviewing any new or changed requirements. + ### Robert Bosch GmbH +#### Purpose + Fostering collaboration, learning and innovation is the main focus of the Bosch InnerSource initiative (BIOS). -To that end, they applied the following principles: + +#### Principles + +To that end, Bosch applied the following principles: - **Openness**: We lower the barriers for entry into BIOS communities as much as we can. - **Transparency**: We are radically transparent and share our work products, our communication, and our decision making with all associates in the company. @@ -147,6 +202,10 @@ Structured * Isabel Drost-Fromm * Georg Grütter +## Acknowledgements + +* Zack Koppert - for sharing GitHub's approach in the Known Instances + ## Alias Explicit InnerSource Principles diff --git a/patterns/2-structured/extensions-for-sustainable-growth.md b/patterns/2-structured/extensions-for-sustainable-growth.md new file mode 100644 index 000000000..bb1fd6de9 --- /dev/null +++ b/patterns/2-structured/extensions-for-sustainable-growth.md @@ -0,0 +1,112 @@ +## Title + +Extensions for Sustainable Growth + +## Patlet + +An InnerSource project is receiving too many contributions, making maintenance difficult. By offering an extension mechanism outside of the core project, the maintainers enable scaling of project capabilities with minimal cost and maintenance overhead. + +## Problem + +As the number of contributions to a mature InnerSource repository rapidly increases, it adds more burden on code reviews and maintenance. This results in a large code review backlog or premature rejection of new feature contributions. + +How can the host team allow for faster release of new features, encouraging innovation and experimentation; while also keeping the repository well maintained? + +## Story + +There is a strategic project that aims to collect the best innovations within a domain space to one common stack, allowing reuse of a common infrastructure and providing a standard user experience. Through InnerSource, various teams in the organization that work within the domain space get an opportunity to collaborate and contribute their innovations to the common codebase. + +However, a large number of contributions in parallel from several developers is making maintenance of the codebase difficult. This is adding a huge burden on the project maintainers who assume ownership over the code quality standards and enable the community through various forms of communication. + +Project maintainers are at risk of burnout due to: + +- Everlasting backlog of pull requests from contributors that need to be reviewed. +- Job dissatisfaction: Majority of maintainers' time spent in community support leaves no room for innovation. +- Perceived lack of accomplishment: Not all contributed features have adequate user demand and result in consequent adoption. +- Time consuming releases: More features in the codebase results in long running tests. +- Increase in maintenance activities: More bugs raised as new capabilities are added. + +A lot of time is spent on maturing every new feature contribution, before potential users even get an opportunity to explore the feature for their use cases. If it turns out that new feature isn't fulfilling the use case, then all that time spent on achieving the desired code quality standards are waste. + +## Context + +- A strategic InnerSource codebase is scaling rapidly with new feature contributions from several employees. +- The ratio of reviewers to contributions results in a growing backlog of pull requests. This is slowing down release of new features to the community. +- Quality of the codebase is degrading and user experience is adversely impacted. +- Maintainers of the codebase are burdened and cannot keep up with the influx of contributions and increased community support. +- Some of the contributed features are not gaining adoption by users, and might even turn fully dormant. However even though they are unused, these features are still adding to the maintenance overhead. +- Organization is investing heavily in hardening of new feature contributions to retain quality standards before the ideas are explored by the community. +- The pattern applies in either scenario: + - Maintainers find themselves rejecting new feature ideas to narrow down the scope of the project. This is hampering innovation in the community and restricting further expansion. + - To reduce backlog, new features are getting released without thorough documentation, hardening, or testing, creating a poor user experience. This is also bloating the size of the codebase, adding a huge dependency graph and making it difficult to maintain. + +## Forces + +- Maintainers and product owners want to allow for expansion, encourage innovation and experimentation without being overly restrictive on contributions, while also keeping good code and quality standards for user experience. +- A large amount of time goes into hardening and thorough testing of features to meet product standards, but product owners may want to allow for faster release of new innovations for adopting products to explore before investing time in maturing the capabilities. +- Maintainers want to encourage the community to share innovations that combine product capabilities with other use-cases without adding more dependencies to the primary repository. + +## Solutions + +Allowing [extensions/plugins](https://en.wikipedia.org/wiki/Extensibility) to high-scale InnerSource codebases can relieve the maintenance burden on repository maintainers and allow faster release of new features for adopting products to explore. This shifts maintenance of capabilities to extension owners and allows the primary repository to support capabilities that have been adopted more widely and are more strategic. + +Extensions provide a filter for new capabilities that may eventually move into the core of the project. Extensions also act as an incubation and community hardening environment, allowing for much of that hardening to happen organically rather than in a costly review process. + +In order for the extensions model to be successful, there are few architectural considerations to keep in mind: + +1. **Easy to create:** To obtain community participation, extensions need to be easy to create. + - Create a repository template that extensions should use as a starting point. This allows the extensions to add their new features in new repositories, separate from the core project. The template should provide the same modular structure as the primary repository, and include the framework to package and release extensions. + - Ensure that as the primary repository changes, the template(s) are well-maintained. The primary repository maintainers are responsible for updating the template(s) to ensure it is compatible with the main project. Following good versioning conventions, e.g., [semver](https://semver.org/), makes this easier to follow. + - It is further recommended that the primary repository maintainers provide guidance on how to update extensions based on older versions of the template as newer versions are released. + - Add example extension(s) developed from the template, which project developers can reference to understand how to write a well-patterned extension. + - Loosen the requirements for contributors to create extensions by bypassing reviews to allow for faster release or experimentation. +2. **Loose coupling:** Having modular components that contain functionality can allow loose coupling, where changes to extensions do not impact the quality of the main codebase or other extensions. +3. **Dependency management:**  Each extension should be careful to pin the version range of the primary repository that it is built against (the same way it would any other dependency) and should be careful in its use of other dependencies that shadow dependencies of the primary repository such that the versions it chooses for those dependencies are compatible with the primary repository versions selected. Any conflicts with primary repository will be caught in the test framework for the extension. +4. **Testing strategy:** How to test extensions both individually and in combination? + - **Testing extension individually:** Extensions template will provide a test framework to be used by the extension developers to test the capability added. This can include a framework for unit tests, runtime performance and quality tests. + - **Testing extension in combination with primary repository:** Extension developers have a well-patterned method for testing their extension against specific versions of the primary repository without involvement from the primary repository's maintainers. + - **Testing extension in combination with other extensions:** Providing a test framework for this scenario could result in being excessive especially if there are a large number of extensions that are still being explored by users and unlikely to be all used in combination. If a user runs into conflicts while using extensions in combination (which should be unlikely with sufficient loose coupling), the user can raise an issue to the respective extension owners who will sort it out. As an extension reaches later phases of the lifecycle and gets merged into the primary repository, it would be tested in combination with rest of library and any dependency conflicts will have to be resolved at the time. +5. **Discoverability and Usability:** + - Make extensions easily discoverable with a publishing page showing the extensions that users have created and want to share for product usage. + - Allow registration of extensions with the primary project for users to leverage extensions alongside the original project, thus keeping the same user experience. +6. **Lifecycle of extensions and maintainability:** Establish the lifecycle for extensions from creation to porting into the primary codebase, along with clear ownership guidelines. + - Extension creators continue maintaining the extension, providing any support and fixing defects. Any extension left unmaintained will be unlisted from the publishing page. + - Create criteria for when an extension can be ported to the primary repository, such as adoption of the extension by internal products and demand for the feature. + - Porting process of the extension to the primary repository will follow more stringent code review guidelines as set by library maintainers. + +![Software architecture with extensions](../../assets/img/extensions-for-sustainable-growth/extensions-for-sustainable-growth.png) + +Following these principles ensures that: + +- Developers can add new features to a project's ecosystem without requiring them to write large amounts of [boilerplate](https://en.wikipedia.org/wiki/Boilerplate_code) code. +- Extensions are discoverable in a repeatable manner by all users of the primary project; just because code doesn't live in the main repository yet does not mean it is not valuable. +- The maintainer burden is reduced until an extension has demonstrated that it fills an important gap in the primary project. +- The core project's common code (e.g. base classes and utility functions) can be a starting point for new development that extends project's domain. This avoids the need to port innovative work after-the-fact, thus reducing the overall burden of developing novel features for the project. +- Developers are more likely to contribute and stay involved in maintenance and building communities for their codebase, which is also good for the health of the overall project ecosystem. + +## Resulting Context + +- The project is able to scale with the addition of new features, without adding maintenance overhead on the primary project repository. +- Faster release of new features for the community to explore, encouraging innovation and experimentation. +- Reduced the costly code review and feature hardening process until the feature is able to prove its utility. This has cost savings benefits for the organization. +- A post problem that can be introduced - what happens if an extension can not complete the full lifecycle? + - If an extension is not adopted over a period of time and could not build a community around it to support maintenance, it would be up to the extension owner to continue maintaining it for however long they want to. If an extension is left unmaintained, it would be unpublished. + - If an extension developer is unable to further maintain their project, and other developers in the community want to continue supporting it, they may maintain the extension going forward. + +## Known Instances + +* **IBM Corporation** has adopted this solution to scale [InnerSource AI libraries](https://youtu.be/Lz-tIc2cyRM). Using extensions, developers are able to extend AI libraries with more algorithms and share their innovations with the company-internal community. The core libraries only contain strategic algorithms that have been adopted and validated, keeping them easier to maintain as we scale contributions. + +## Alias + +Extensions to Manage Contributions at Scale + +## Status + +Structured + +## Author(s) + +- Sukriti Sharma, IBM +- Alexander Brooks, IBM +- Gabe Goodhart, IBM diff --git a/patterns/2-structured/innersource-portal.md b/patterns/2-structured/innersource-portal.md index cc37c35ed..88c640a35 100644 --- a/patterns/2-structured/innersource-portal.md +++ b/patterns/2-structured/innersource-portal.md @@ -4,27 +4,28 @@ InnerSource Portal ## Patlet -Create an intranet website that indexes all available InnerSource project information. This will enable potential contributors to more easily learn about projects that might interest them and for InnerSource project owners to attract an outside audience. +Potential contributors cannot easily discover InnerSource projects that they are interested in. By creating an intranet website that indexes all available InnerSource project information you enable contributors to learn about projects that might interest them and InnerSource project owners to attract an outside audience. ## Problem InnerSource project teams are finding it difficult to attract outside contributions. -InnerSource projects at your company are increasing but potential contributors have no easy way of discovering them. +InnerSource projects at your organization are increasing but potential contributors have no easy way of discovering them. ## Story -You are attempting to establish an InnerSource practice within your organization. You are aware of some projects being run using an InnerSource model but their existence is only being communicated via word of mouth, email or sidebar conversations with other employees. As a result InnerSource project owners are finding it difficult to attract contributors. There is no single, shared resource for employees across the organization to access which will allow them to easily discover all ongoing InnerSource projects. This is severely limiting the growth potential of every InnerSource project. What can be done to help all InnerSource projects raise their visibility to as large an audience as possible and attract contributors organization-wide? +You are attempting to establish an InnerSource practice within your organization. You are aware of some projects being run using an InnerSource model but their existence is only being communicated via word of mouth, email or sidebar conversations with other employees. As a result InnerSource project owners are finding it difficult to attract contributors. -## Forces +There is no single, shared resource for employees across the organization to access which will allow them to easily discover all ongoing InnerSource projects. This is severely limiting the growth potential of every InnerSource project. -* The full potential for separate engineering teams to partner on shared challenges is not being realized -* It is difficult for individuals to discover what InnerSource projects exist -* It is difficult for InnerSource project owners to attract an audience of external contributors +What can be done to help all InnerSource projects raise their visibility to as large an audience as possible and attract contributors organization-wide? ## Context -Your organization is interested in adopting an InnerSource work style and InnerSource project owners are seeking a way to attract audiences to their projects. However, they are limited by the communication channels available to them through which they could advertise to potential contributors. Compounding this problem is the fact that the shared source control management application in use has such limited search capabilities that even developers in search of InnerSource projects find it frustrating to locate them. +* Your organization is interested in adopting an InnerSource work style. +* InnerSource project owners are seeking a way to attract audiences to their projects. However, they are limited by the communication channels available to them through which they could advertise to potential contributors. +* InnerSource projects at your organization are increasing. +* Compounding this problem is the fact that the shared source control management application in use has such limited search capabilities that even developers in search of InnerSource projects find it frustrating to locate them. ### Prerequisites @@ -32,31 +33,51 @@ Your organization is interested in adopting an InnerSource work style and InnerS * A shared source control management system is in use which provides programmatic access to the contents of the repositories it hosts * There is a department within your organization with the responsibility of promoting InnerSource collaboration +## Forces + +* The full potential for separate engineering teams to partner on shared challenges is not being realized +* It is difficult for individuals to discover what InnerSource projects exist +* It is difficult for InnerSource project owners to attract an audience of external contributors + ## Solutions Create an InnerSource Portal intranet website where InnerSource project owners can easily advertise the availability of their projects. -A [reference implementation](http://github.com/sap/project-portal-for-InnerSource) for this pattern is available on GitHub and open for contributions. It lists all InnerSource projects of a company in an interactive and easy to use way. Projects can self-register using a dedicated GitHub topic and provide additional metadata. +Key properties of the portal are: -Visitors to the InnerSource portal should be able to see all available projects as well as search for specific projects based on various criteria such as project name, technologies in use, contributor names, sponsoring business unit etc. The information displayed via the InnerSource portal should be under the full control of the InnerSource project owners at all times. Preferably, by sourcing this information directly from a specific data file or meta-data stored in the project repository itself. Project owners should include all relevant information concerning their projects within those data files including the project name, trusted contributors names, a brief description and links to the code repository or any supporting documentation. +* Visitors to the InnerSource Portal should be able to see all available projects as well as search for specific projects based on various criteria such as project name, technologies in use, contributor names, sponsoring business unit etc. +* The information displayed via the InnerSource Portal should be under the full control of the InnerSource project owners at all times. Preferably, by sourcing this information directly from a specific data file or meta-data stored in the project repository itself. +* Project owners should include all relevant information concerning their projects within those data files including the project name, trusted contributors' names, a brief description and links to the code repository or any supporting documentation. +* (optional) While most organizations will choose to make their portal only available on their intranet, some organizations have opted to make their portal available on the public internet. The latter can be interesting for organizations that want to show additional information about their InnerSource approach in their portal e.g. for branding and recruitment purposes. -A communications campaign promoting the addition of InnerSource data files or meta-data to code repositories should also be considered in order to bolster the number of projects displayed within the portal. +When launching the portal, a communications campaign promoting the addition of InnerSource data files or meta-data to code repositories should be considered, to bolster the number of projects displayed within the portal. -![Example of an InnerSource Portal](https://raw.githubusercontent.com/SAP/project-portal-for-innersource/main/docs/overview.png "Example of an InnerSource Portal") +A [reference implementation](https://github.com/SAP/project-portal-for-innersource) of an InnerSource portal is available on GitHub and open for contributions. It lists all InnerSource projects of an organization in an interactive and easy to use way. Projects can self-register using a dedicated GitHub topic and provide additional metadata. + +![Example of an InnerSource Portal](../../assets/img/portal-overview.png "Example of an InnerSource Portal") ## Resulting Context -The InnerSource Portal has enabled InnerSource project owners to advertise their projects to an organization-wide audience. Due to this increased visibility they are attracting much larger communities of contributors than ever before. For those looking to get involved in InnerSource projects, the InnerSource portal has allowed them to discover exactly the kind of opportunities they are interested in by searching across all available InnerSource projects simultaneously based on their specific criteria. Satisfying the needs of both of these audiences has helped establish InnerSource as a viable and attractive option for all areas of the organization to leverage to accomplish things together they could not have separately. +* The InnerSource Portal has enabled InnerSource project owners to advertise their projects to an organization-wide audience. Due to this increased visibility they are attracting much larger communities of contributors than ever before. +* For those looking to get involved in InnerSource projects, the InnerSource Portal has allowed them to discover exactly the kind of opportunities they are interested in by searching across all available InnerSource projects simultaneously based on their specific criteria. +* Satisfying the needs of both of these audiences has helped establish InnerSource as a viable and attractive option for all areas of the organization to leverage to accomplish things together they could not have separately. ## Known Instances -* A large financial services organization has used the creation of an InnerSource Portal to provide a mechanism of advertising and discovering InnerSource projects in existence across different business units -* SAP promotes InnerSource projects in the InnerSource portal - projects can self-register using GitHub topics. The [Repository Activity Score](repository-activity-score.md) defines the default order of the InnerSource projects in the portal. Also see [Michael Graf & Harish B (SAP) at ISC.S11 - The Unexpected Path of Applying InnerSource Patterns](https://www.youtube.com/watch?v=6r9QOw9dcQo&list=PLCH-i0B0otNQZQt_QzGR9Il_kE4C6cQRy&index=6). It's codebase is published as a [reference implementation](http://github.com/sap/project-portal-for-InnerSource) and open for contributions. -* Elbit Systems has used this pattern and added gamification on top. +* **A large financial services organization** has used the creation of an InnerSource Portal to provide a mechanism of advertising and discovering InnerSource projects in existence across different business units +* **SAP** promotes InnerSource projects in the InnerSource Portal - projects can self-register using GitHub topics. The [Repository Activity Score](repository-activity-score.md) defines the default order of the InnerSource projects in the portal. Also see [Michael Graf & Harish B (SAP) at ISC.S11 - The Unexpected Path of Applying InnerSource Patterns](https://www.youtube.com/watch?v=6r9QOw9dcQo&list=PLCH-i0B0otNQZQt_QzGR9Il_kE4C6cQRy&index=6). Its codebase is published as a [reference implementation](https://github.com/SAP/project-portal-for-innersource) and open for contributions. +* **Elbit Systems** has used this pattern and added gamification on top. * [Gamification As Means of Cultural Change and InnerSource Engagement Booster](https://www.oreilly.com/library/view/oscon-2018-/9781492026075/video321579.html) | Shelly Nizri | OSCON 2018 - Portland, Oregon * Of Islands, Monsters & InnerSource [(slides)](https://docs.google.com/presentation/d/1P1OCEK9B6eSrVRUclVWY6meSI-qHOBjM_UAPNvCZamU/edit#slide=id.p15), [(video)](https://drive.google.com/file/d/1pM89uHMn0vhE3ayFJDGYcCO8R0tAXXZD/view?usp=drivesdk) | InnerSource Spring Summit 2019 (Galway, Ireland) - * The code realizing this platform has been open sourced and is available here: https://gitlab.com/gilda2 -* American Airlines promotes InnerSource projects via an [internal InnerSource Marketplace](https://tech.aa.com/2020-10-30-innersource/). Similarly to SAP, projects self-register by adding `innersource` as a GitHub topic. Projects are searchable and filterable by language, topics, number of open issues, etc. + * The code realizing this platform has been open sourced and is available at [gitlab.com/gilda2](https://gitlab.com/gilda2) +* **American Airlines** promotes InnerSource projects via an [internal InnerSource Marketplace](https://tech.aa.com/2020-10-30-innersource/). Similarly to SAP, projects self-register by adding `innersource` as a GitHub topic. Projects are searchable and filterable by language, topics, number of open issues, etc. +* **Banco Santander** has created a public portal called "Santander ONE Europe InnerSource Community" to support and increase InnerSource adoption. In addition to the catalog of projects the portal includes relevant content such as documentation, way of working, news, and events. + +![Santander InnerSource Portal](../../assets/img/santander_portal.png "Banco Santander InnerSource Portal") + +* **Airbus** deployed the [SAP portal](https://github.com/SAP/project-portal-for-innersource) with minor modifications to match Airbus graphical identity. In addition, the [Python crawler](https://github.com/zkoppert/innersource-crawler) was patched to work with GitHub Enterprise instances. + +* **Mercado Libre** use an instance of the [SAP portal](https://github.com/SAP/project-portal-for-innersource) to discover existing InnerSource projects within the organization. ## References @@ -69,3 +90,10 @@ The InnerSource Portal has enabled InnerSource project owners to advertise their ## Author(s) * Stephen McCall + +## Acknowledgements + +* Shelly Nizri +* Melinda Malmgren +* Michael Graf +* Jesús Alonso Gutierrez diff --git a/patterns/2-structured/project-setup/base-documentation.md b/patterns/2-structured/project-setup/base-documentation.md index d278ff35e..746c87079 100644 --- a/patterns/2-structured/project-setup/base-documentation.md +++ b/patterns/2-structured/project-setup/base-documentation.md @@ -61,6 +61,8 @@ contain: * A "Who we are" section explaining who the [Trusted Committers](../trusted-committer.md) behind the project are - with an explanation that instead of contacting these people privately the public communication channels above should be used for communication. * An explanation of what the criteria are for the project to turn contributors into Trusted Committers - if that path exists. +![README.md](../../../assets/img/standard-base-documentation/README-for-users.png) + ### CONTRIBUTING.md If the explanation of the steps to make a contribution are too involved, create @@ -77,7 +79,7 @@ topics: * How to submit your modifications back to the project. * Some information on which turnaround time to expect for modifications made. -![Brief picture of README.md and CONTRIBUTING.md content](./assets/base_docs_drawing.png) +![CONTRIBUTING.md](../../../assets/img/standard-base-documentation/CONTRIBUTING-for-contributors.png) There are many of good examples for how to write a `README.md` and what kind of information to include in a `CONTRIBUTING.md` file in various open source projects. @@ -107,6 +109,7 @@ started right away: [README-template.md](templates/README-template.md) and * Europace AG - See blog post [InnerSource: Adding base documentation](https://tech.europace.de/post/innersource-base-documentation/) * Paypal Inc. +* Mercado Libre - create a documentation site that contains how to get started with InnerSource and also define the basic artifacts that a repository must have to be InnerSource (README, CONTRIBNUTING, CODING_GUIDELINES, etc). ## Authors @@ -125,3 +128,7 @@ Provide standard base documentation through a README * [README-template.md](templates/README-template.md) and * [CONTRIBUTING-template.md](templates/CONTRIBUTING-template.md) + +## Credits + +[Web](https://storyset.com/web) and [People](https://storyset.com/people) illustrations by Storyset diff --git a/patterns/2-structured/project-setup/communication-tooling.md b/patterns/2-structured/project-setup/communication-tooling.md index e7fe502c1..b6b9ab003 100644 --- a/patterns/2-structured/project-setup/communication-tooling.md +++ b/patterns/2-structured/project-setup/communication-tooling.md @@ -78,6 +78,7 @@ to a lower need to repeat explanations. * Europace AG * Paypal Inc. +* Mercado Libre ## Authors diff --git a/patterns/2-structured/repository-activity-score.md b/patterns/2-structured/repository-activity-score.md index 76a94eb0a..81c24c3d1 100644 --- a/patterns/2-structured/repository-activity-score.md +++ b/patterns/2-structured/repository-activity-score.md @@ -46,7 +46,7 @@ The repository activity score is a numeric value that represents the (GitHub) ac In addition, it considers activity parameters like last update and creation date of the repo to give young projects with a lot of traction a boost. Projects with contributing guidelines, active participation stats, and issues (public backlog) receive a higher ranking as well. -All of this can be fetched and calculated automatically using the result set of the [GitHub search API](https://developer.github.com/v3/search/#search-repositories) and [GitHub statistics API](https://developer.github.com/v3/repos/statistics/). Other code versioning systems like BitBucket, Gitlab, Gerrit can be integrated as well if a similar API is available. +All of this can be fetched and calculated automatically using the result set of the [GitHub search API](https://docs.github.com/en/rest/search#search-repositories) and [GitHub statistics API](https://docs.github.com/en/rest/metrics/statistics). Other code versioning systems like BitBucket, Gitlab, Gerrit can be integrated as well if a similar API is available. The code below assumes the variable `repo` contains an entity fetched from the GitHub `search` API and the `participation` object contains an entity from the GitHub `stats/participation` API. @@ -71,7 +71,7 @@ function calculateScore(repo) { repo._InnerSourceMetadata = repo._InnerSourceMetadata || {}; if (repo._InnerSourceMetadata.participation) { // average commits: adds a bonus multiplier between 0..1 to overall score (1 = >10 commits per week, 0 = less than 3 commits per week) - let iAverageCommitsPerWeek = repo._InnerSourceMetadata.participation.slice(repo._InnerSourceMetadata.participation.length - 13).reduce((a, b) => a + b) / 13; + let iAverageCommitsPerWeek = repo._InnerSourceMetadata.participation.slice(-13).reduce((a, b) => a + b) / 13; iScore = iScore * ((1 + (Math.min(Math.max(iAverageCommitsPerWeek - 3, 0), 7))) / 7); } diff --git a/patterns/2-structured/review-committee.md b/patterns/2-structured/review-committee.md index 422b50a62..a0d72f03b 100644 --- a/patterns/2-structured/review-committee.md +++ b/patterns/2-structured/review-committee.md @@ -31,7 +31,7 @@ Company A wants to introduce its first InnerSource initiative. Most managers in - An InnerSource project leader can also present the motion to be shut down on its own initiative on a review committee. The review committee then has to decide whether or not the business units using the software need to be given time to put measures in place to ensure that development and/or maintenance of the codebase continues until an alternative solution to development by the InnerSource community is found (if business relevant or mission critical). - The review committee should convene regularly. A cadence of two meetings per year has proven successful. -Review Committee Sketch +![Review Committee Sketch](../../assets/img/review-committee-sketch.jpg) ## Resulting Context diff --git a/patterns/2-structured/service-vs-library.md b/patterns/2-structured/service-vs-library.md index 1de24089c..8779615e4 100644 --- a/patterns/2-structured/service-vs-library.md +++ b/patterns/2-structured/service-vs-library.md @@ -73,7 +73,7 @@ Related to this pattern is the [30 Day Warranty](30-day-warranty.md) pattern tha ## Known Instances * Europace AG -* Flutter Entertainment: A [Flutter InnerSource application](https://innersource.flutter.com/start/setup-ci/) has a shared code "service" repository with cross-team contribution and CI pipeline to build and publish a shared release artefact. Each adopting team has a "deployment config" repository defining their own deployment. This is driven by varying regulatory requirements, service and incident management practices and infrastructure skill sets in different areas of the business. +* Flutter Entertainment: A [Flutter InnerSource application](https://innersource.flutter.com/sdlc/) has a shared code "service" repository with cross-team contribution and CI pipeline to build and publish a shared release artefact. Each adopting team has a "deployment config" repository defining their own deployment. This is driven by varying regulatory requirements, service and incident management practices and infrastructure skill sets in different areas of the business. ## Status diff --git a/patterns/2-structured/transparent-cross-team-decision-making-using-rfcs.md b/patterns/2-structured/transparent-cross-team-decision-making-using-rfcs.md index 54baaf08b..484708276 100644 --- a/patterns/2-structured/transparent-cross-team-decision-making-using-rfcs.md +++ b/patterns/2-structured/transparent-cross-team-decision-making-using-rfcs.md @@ -37,7 +37,7 @@ Like with any process, this must be continually improved upon. There may need to ## Sketch -**TBD** +![RFC process used at Uber's BaseUI project (open source example)](../../assets/img/rfc-process-uber-baseui.png) ## Solutions @@ -95,8 +95,9 @@ Also for decision making outside of pure software design decisions, transparent - **BBC iPlayer & Sounds** - As presented at the ISC Fall Summit 2020 [Using Internal RFCs to Enhance Collaboration][bbc]. - **Europace** - As described in Open Organization: [Setting cross-team standards and best practices in the open][europace]. -- **Uber** - According to this blog post by Gergely Orosz: [Scaling Engineering Teams via Writing Things Down and Sharing - aka RFCs][uber]. +- **Uber** - According to this blog post by Gergely Orosz: [Scaling Engineering Teams via RFCs: Writing Things Down][uber]. - **Google Design Docs** - As described in this blog post by Malte Ubl [Design Docs at Google][google] +- **DAZN** (10/2021) - One way that DAZN makes technical decisions is via RFCs. RFCs are used for decisions that apply to engineering-wide processes only! The RFCs live in a GitHub repository, and technical standards are then gradually adopted within their tools and by their engineers. An RFC can be raised by any engineer, and voted on by all engineers. If upvotes exceed downvotes, the RFC is adopted. It’s worth noting, that the RFC voting process hasn’t yet been “stress-tested” by any contentious decisions. - As described in this blog post by Lou Bichard: [Building A DX Team: Lessons Learned][dazn] ## Status @@ -121,3 +122,4 @@ Structured [open-decision-framework]: https://www.redhat.com/en/about/press-releases/red-hat-releases-open-decision-framework-spur-transparent-and-inclusive-leadership [bbc]: https://www.youtube.com/watch?v=U6zlghE0HcE [google]: https://www.industrialempathy.com/posts/design-docs-at-google/ +[dazn]: https://medium.com/dazn-tech/building-a-dx-team-lessons-learned-4a66446088bc diff --git a/patterns/2-structured/trusted-committer.md b/patterns/2-structured/trusted-committer.md index 382f99f79..641a22817 100644 --- a/patterns/2-structured/trusted-committer.md +++ b/patterns/2-structured/trusted-committer.md @@ -127,6 +127,9 @@ This has been tried and proven successful at: - Nike - PayPal +- Mercado Libre - adds a section in the `CONTRIBUTING.md` file to inform who the Trusted Committers are. + +![Trusted Committer section in CONTRIBUTING.md of Mercado Libre](../../assets/img/mercadolibre-trusted-committers.png "Trusted Committer section in CONTRIBUTING.md of Mercado Libre") ## Status diff --git a/translation/README.md b/translation/README.md new file mode 100644 index 000000000..c3d3d10f8 --- /dev/null +++ b/translation/README.md @@ -0,0 +1,62 @@ +# Translation Process and Recommendations + +If you would like to contribute to the InnerSource Patterns translation, great! We would love to work with you! + +First, please refer to [CONTRIBUTING.md](/CONTRIBUTING.md) for basic contribution instructions. + +This document covers basic translation principles, how you can contribute, and the review process. + +Please note that this document contains recommendations, aimed at removing barriers for new contributors to the translation process. If you see something missing, please feel free to make suggestions. + +## The Translation Principles and Recommendation + +- The target of the translation are structured patterns. Find them in folder [/patterns/2-structured/](../patterns/2-structured/). Only structured patterns will be published in Gitbook. +- English is recommended for commit messages. If your changes are merged, your commit messages will be seen by members all over the world. This will make it easier for global members to find your activities and will also accelerate collaboration. +- Regarding Pull Requests and Issues, it is a good idea to use English, at least for the title and the purpose statement in the preface. Contributions in your language and accompanying discussions may be useful for other translation projects in the future. +- Each country has its own cultural and historical background and different contexts. There is no need to discuss language-specific nuances and difficult linguistic expressions in English in your review. Especially if it is a local community of several people translating together, please prioritize the ease of translation in that community. + +## How to Contribute to the Translation + +### Improving an Existing Translation + +- Please make your changes to the respective `.md` file. +- Once you are ready, send us a Pull Request. + +### Translating a new InnerSource Patterns + +- Copy the pattern that you want to translate from `/patterns/2-structured/.md` to `/translation//patterns/.md`.[^1] Make sure to keep the file name the same. +- Then start your translation in that new file. +- Once you are ready, send us a Pull Request. + +### Starting the Translation of a New Language + +That is awesome! We welcome your passion. When implementing InnerSource practices in your region, there can be language barriers. There is great value in getting people in your organization to understand InnerSource in their own language. + +Before starting a new translation please talk to us in Slack (in the `#innersource-patterns` channel). Alternatively open an issue on this GitHub repo to start an async conversation about your translation project. + +The translation should begin by creating a `book-` branch to work on.[^1] +e.g. `book-jp` is used for the Japanese translation. + +There are a few things you should prepare before starting a translation project. + +- `/translation//patterns/` +- `/translation//templates/` +- `/translation//README.md` + +However, since git does not create empty folders, it is better to create directories accordingly or add `.keep` files to keep folders. + +### Translation Quality and Review Process + +We consider it best practice to have **at least one native speaker** review the translation. + +In particular, for special terms, such as "Trusted Committer", please review not only for grammatical correctness but also for appropriateness. If you find a term or expression difficult to understand, please don't hesitate to ask. + +### Publishing Translations + +The books currently available are in English and Japanese. + +Trusted Committers in this repository will also be onboarded during the translation process. + +When you complete a translation under `/translation//`, a GitHub Actions pipeline will run to generate the output for publication in the gitbook. The process is described in detail in [/book/README.md](/book/README.md). + +[^1]: Replace `` with the 2-letter language code for your language. diff --git a/translation/ja/patterns/30-day-warranty.md b/translation/ja/patterns/30-day-warranty.md new file mode 100644 index 000000000..72d84294e --- /dev/null +++ b/translation/ja/patterns/30-day-warranty.md @@ -0,0 +1,78 @@ +## Title + +30日の保証期間 + +## Patlet + +自分のチーム以外からのコントリビューションを受け入れる場合、チームが書いていないコードの責任を持つことに抵抗があることは自然なことでしょう。 +「30日の保証期間」プラクティスを利用すると、コードにコントリビュートしたチームはコードを受け取ったチームに対してバグフィックスを提供することを承諾することになります。 +そうすることで、両チーム間の信頼度が高まり、コントリビューションが受け入れられる可能性が高くなります。 + +## 問題 + +あるチームが、組織全体で使用されるコンポーネントを開発しています。 このチームはコントリビューション(機能への要求を含む) を受け入れることに抵抗したり、完全に拒否したりします。 +この振る舞いは進行を妨げたり、エスカレーションによる頻繁な混乱につながります。 + +## 状況 + +- コントリビューションを受け入れる側のチームによって生み出されたコンポーネントを、コントリビュートした側のチームが使えるかどうか、それは他のチームが受け入れてくれるかに依存してしまいます。 +- 受け入れる側のチームが、コントリビュートされたコンポーネントや機能に対するリソース・知識・許可を持っていないか、もしくは(それに加えて) それらのコンポーネントや機能を自分自身で書く意欲がない場合があります。 + +## 組織に働く力学 + +- 過去に不正行為があったため、コントリビューションに対する不信感があります。例として、チームは中途半端にしたコントリビューションを提供し、その後に本番で使えるように修正するよう要求してきました。 +- チーム外からコードを提供された場合、他のチームはチームの期待に沿うようなコードの書き方を知らないのではないかという疑念を持つことは自然なことです。 +- 各チームは、自分のリーダーが目標を達成するための活動を第一に考えます。この忠誠心の方向性が、この問題の解決を複雑にすることがあります。 +- 自分で書いていないコードに責任を持つことに抵抗があることは自然なことです。 +- コントリビュートされたものは、コードベースに受け入れる前に大きく書き換える必要があります。 +- コントリビュートした後、バグフィックスなどのサポートが受けられなくなる恐れがあります。 +- コントリビュートされたコードが高いメンテナンスコストにつながることを恐れているが、それをどのように管理すればよいのかわかりません。 +- 受け入れ側のチームは、他の人にコードを提供する方法を教えることで、自分たちのシステムの技術的負債が露呈し、それによって損害が発生することを恐れています。 +- 受け手のチームは、いくら指導しても納得のいくコードが得られるとは思っていないかもしれません。 +- どちらのチームも、リスクを測定したり、コントリビューションの中でリスクが軽減されていることを証明することに自信を持てないかもしれません。例えば、システム自体がややもろいなどの理由が挙げられます。(テストが完全でなかったり全ての問題を拾いきれてないかもしれません。) + +## 解決策 + +コントリビュートしたコードが本番稼動した時点から **30日の保証期間** を設けることで、受け入れた側とコントリビュートした側の双方の不安に対処します。この保証期間中、コントリビュートしたチームは受け入れたチームにバグフィックスを提供することに同意します。 + +なお、保証期間は45日、60日、100日のいずれでもかまいません。この期間は、プロジェクトの制約、プロジェクトのソフトウェアライフサイクル、顧客との約束事項、その他の要因に基づいて変化される可能性があります。 + +さらに、受け入れ側のチームとコントリビュートする側のチームの期待値を明記した、明確な[コントリビューションのガイドライン](./base-documentation.md)を提供することも役に立ちます。 + +![30 Day Warranty](../../../assets/img/thirtydaywarranty.jpg) + +## 結果の状況 + +- 受け入れ側のチームがコントリビューションを受け入れ、初期適応/修正の作業負担を分担することができます +- 透明性と公平性が高まります +- エスカレーションが重荷になりすぎないようになります + +## 事例 + +- これは PayPal で試みられ、成功したことが証明されています。 +- GitHub は社内でこのパターンを使っており、6週間という修正された保証タイムラインを使っています。 +- Microsoft はこのパターンを原則として推奨しています。チームは自分たちのニーズと自信にマッチするよう具体的な時間目標を設定します。 + +## 著者 + +- Cedric Williams + +## 謝辞 (Acknowledgment) + +- Dirk-Willem van Gulik +- Padma Sudarsan +- Klaas-Jan Stol +- Georg Grütter + +## ステータス + +* Structured +* Drafted at the 2017 Spring InnerSource Summit; reviewed 18 July 2017. + +## 同種の例 + +- 複数の、功績至上主義的に任命された[トラステッドコミッター](./trusted-committer.md)が責任を持つことで、依存するチームの協力をコミュニティ化することで保証する。 + +## 翻訳の履歴 + +- **2022-05-26** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) diff --git a/translation/ja/patterns/base-documentation.md b/translation/ja/patterns/base-documentation.md new file mode 100644 index 000000000..8a2ca90f0 --- /dev/null +++ b/translation/ja/patterns/base-documentation.md @@ -0,0 +1,96 @@ +## Title + +スタンダード・ベース・ドキュメンテーション + +## Patlet + +インナーソースプロジェクトへの新しいコントリビューターは、誰がプロジェクトを維持し、何に取り組み、どのようにコントリビューションすればよいかを理解するのに苦労しています。`README.md`/`CONTRIBUTING.md` のような標準ファイルでドキュメントを提供することで、新しいコントリビューターのためのセルフサービスなプロセスを可能にし、よくある質問に対する答えを自分自身で見つけることができるようにします。 + +## 問題 + +あるチームは、新しく始めたプロジェクトや既存のプロジェクトをより広い組織で共有し、それに対するコントリビューションを受けたいと考えています。潜在的なコントリビューターは、しばしば迷ってしまいます。チームの好ましいコミュニケーションチャネルを特定できない。新しい機能が追加されることに意味があるのかどうか、すぐに判断することはできません。また現在、どの同僚が活発にプロジェクトをメンテナンスしているのかを正確に理解するのに苦労しています。 + +## 状況 + +プロジェクトは、インナーソースプロジェクトとして他の人と共有されることになります。他の人がプロジェクトが何であるか、また、どのようにコントリビュートするかを理解できるようにするために、プロジェクトはいくつかの基本的なレベルのドキュメントを提供する必要があります。これまでのところ、プロジェクトは、すべてのドキュメントまたはユーザーがセルフサービス方式でそれを試してみるだけでなく、コントリビューターが迅速にスピードアップするために必要な項目がいくつか不足しています。 + +## 組織に働く力学 + +* プロジェクトがインナーソースのプロジェクトになったのは、つい最近のことです。以前は、ユーザーは社内のみ、または個人的な対面セッションでオンボーディングされていました。同様に、プロジェクトで働く人々は、コントリビューターやリモートコントリビューターの数の増加に伴いスケールしない個人的なオンボーディングセッションを通過しました。その結果、セルフサービスの文書が不足しています。 +* プロジェクトは、インナーソースプロジェクトとして新しく作成されました。しかし、ホストチームには、十分なインナーソースの経験がありません。その結果、彼らはどのような情報についてのガイダンスをドキュメントに含める必要があるのか、他の人がどこでそれを見つけることができるようにすべきか、どのような人に対してそのドキュメントを提供すべきなのかがわかりません。 +* プロジェクトは、つい最近インナーソースプロジェクトになりました。ホストチームは、インナーソースに関して限られた経験を持っています。その結果として既存のドキュメントは、技術的な側面の多くに対応していますが、コミュニケーション、調整、透明性の高い計画を促進するために必要な情報をカバーしていません。 +* プロジェクトは、ごく最近インナーソースのプロジェクトになりました。その結果、チーム内に存在する多くの暗黙の知識が書き留められることはなく、コントリビューターにとっても明らかではありません。 +* ドキュメントの欠如は、潜在的なコントリビューターがセットアップをして作業を開始するのに長い時間がかかることにつながります。ドキュメントを作成する(そしてそれを最新に保つ)には、時間的な投資が必要です。たとえホストチームがドキュメントの欠如に関してコントリビューターに頼ったとしても、それらのコントリビューションはレビューする時間を必要とします。 +* プロジェクト・メンバーは、使い始めの質問に答えるために多くの時間を費やしています。しかし、サポートに関する質問の包括的なデータベースを維持することは、多くの時間と労力を必要とします。 +* ソースコードのフォーマットやソフトウェアのパターンについて、組織内の異なるチームが異なる基準を持っています。その結果、コントリビューションはしばしば、大部分または全体が書き直されてしまうこともあります。そのすべてを標準化し、その標準を強制するには、多くの時間と労力が必要になるケースがあります。 +* このように、説明と書き直しを繰り返す作業は、インナーソースアプローチの有用性を低下させます。 +* 余分な仕事と書き直しのための遅延による頻繁なエスカレーションは、ビッグチーズ問題(*)に発展します。 + (*ビッグチーズ問題について-和: ビッグチーズとは「お偉いさん」のことを指します。現場がわからない上の人同士でコミュニケーションをとることによる問題をさします。例として、政治的にコードベースへの統合が実施されることで、例えそのコードが要件を満たしていなくても統合しなければいけない状況が起こり、コントリビューションを受け入れる側が多くの作業をかかえることになります) + +## ソリューション + +新しいコントリビューターのために、より明確なドキュメント作成の作業に取り組む。このドキュメントを作成する際の目標は、よくある質問に標準的なドキュメント形式で回答することで、可能な限りセルフサービスのプロセスを開始できるようにすることです。 + +### README.md + +まだ存在しない場合は、あなたのプロジェクトの `README.md` を作成してください。それには以下の内容が含まれていなければなりません。 + +* [プロジェクトのミッション](https://producingoss.com/en/producingoss.html#mission-statement) できるだけ簡潔な形式にしてください。これは、プロジェクトの目的が何であるかに答え、提案された機能がプロジェクトの範囲内にあるかどうかを、コントリビューターが最初に推測できるようにする必要があります。 +* プロジェクトで実働をするユーザーに向けた "Getting Started" セクション。プロジェクトの成果物をどのようにセットアップし、統合するかを説明し、初めてのユーザーのためのファーストステップに関する説明も必要です。 +* プロジェクトユーザーのための詳細なドキュメント - またはそれへのリンク +* プロジェクトを修正するために必要なドキュメント - またはそれへのリンク +* プロジェクトにコントリビュートする方法に関するドキュメント - またはそれへのリンク +* プロジェクトがどのようなアクセス可能なパブリックもしくはアーカイブのコミュニケーションチャネルを用いているかを説明する "Getting involved" セクション。このリンクには、プロジェクトのイシュー・トラッカーへのリンクだけでなく、さらなるディスカッションメディアへのリンクも含めるべきです。 +* プロジェクトを支える [トラステッドコミッター](./trusted-committer.md)が誰であるかを説明する "Who we are" のセクション。これらの人々と個人的に連絡を取る代わりに、上記の公開コミュニケーションチャンネルを使用して連絡を取るべきであるという説明も必要です。 +* プロジェクトが貢献者を信頼されるコミッターにするための基準(もしそのような道があるならば)の説明です。 +* コントリビューターがそのプロジェクトにおけるトラステッドコミッターになるための基準及び、そのパスが存在するならばそのパス + +### CONTRIBUTING.md + +コントリビューションを行うための手順の説明が複雑すぎる場合は、`CONTRIBUTING.md` というドキュメントを別に作成します。この文書では、コントリビューターが過去によく聞かれた質問に答えるようにします。前もって包括的なドキュメントを提供する必要はありません。むしろ、コントリビューターが必要としていることが証明された情報を共有しましょう。おそらく、以下のトピックのうちの1つ以上に触れることになるでしょう。 + +* プロジェクトのソースコードをバージョン管理からチェックアウトする方法 +* プロジェクトに変更を加える方法 (コーディングガイドラインに関する情報を含む可能性があります) +* プロジェクトをビルドする方法 +* 上記の修正が新しいバグを引き起こしていないことを確認するためのテストの実行方法 +* プロジェクトにあなたの修正をサブミットする方法 +* 修正が行われた場合、変更が取り込まれるまでに必要な所要時間に関する情報 + +![Brief picture of README.md and CONTRIBUTING.md content](../../../patterns/2-structured/project-setup/assets/base\_docs\_drawing.png) + +様々なオープンソースプロジェクトにおいて、 `README.md` の書き方や、 `CONTRIBUTING.md` ファイルにどのような情報を含めるべきかについての良い例がたくさんあります。[How to write a readme that rocks](https://m.dotdev.co/how-to-write-a-readme-that-rocks-bc29f279611a), [Open Source Guide from GitHub](https://opensource.guide/) や書籍 [Producing Open Source](https://producingoss.com/en/producingoss.html)などのページには、どのような情報を提供すべきなのかについての貴重な情報が掲載されています。Producing Open Source には、良い README を書くための章はありませんが、[Getting Started chapter](https://producingoss.com/en/producingoss.html#starting-from-what-you-have) には、ホストチームのメンバー、ユーザー、コントリビューターが必要とするもののかなり広範なリストがあります。インナーソースのプロジェクトは、おそらく最初からこれらの側面のすべてをカバーする必要はありませんが、リスト自体は README.md がカバーできるものを想起するために有効です。 +このパターンには、すぐに始められるように、2つの非常に基本的なテンプレートが付属しています。[README-template.md](../templates/README-template.md) と [CONTRIBUTING-template.md](../templates/CONTRIBUTING-template.md) をご参照ください + +## 結果の状況 + +* コントリビューターがスピードを上げるまでの時間が大幅に短縮されます +* [トラステッドコミッター](./trusted-committer.md) が初歩の質問に答える時間が大幅に短縮され、他の作業に時間を割くことができるようになります +* 誤った理解や、同じ方向を向いていないことによるエスカレーションが大幅に削減されます + +## 事例 + +* Europace AG - こちらのブログをご覧ください [InnerSource: Adding base documentation](https://tech.europace.de/post/innersource-base-documentation/) +* Paypal Inc. + +## 著者 + +* Isabel Drost-Fromm + +## その他の呼び方 + +Provide standard base documentation through a README + +## ステータス + +* Structured +* Drafted in December 2019. + +## リファレンス + +* [README-template.md](../templates/README-template.md) and +* [CONTRIBUTING-template.md](../templates/CONTRIBUTING-template.md) + +## 翻訳の履歴 + +- **2022-06-01** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/common-requirements.md b/translation/ja/patterns/common-requirements.md new file mode 100644 index 000000000..b63ff47bb --- /dev/null +++ b/translation/ja/patterns/common-requirements.md @@ -0,0 +1,78 @@ +## Title + +共通要件 + +## Patlet + +共有リポジトリにある共通のコードは、それを使いたいすべてのプロジェクトチームのニーズを満たしていません。これは、要件の調整とリファクタリングによって解決されます。 + +## 問題 + +共有リポジトリにある共通コードは、それを使いたいすべてのプロジェクトのニーズを満たしていません。 + +## 状況 + +* すべてのプロジェクトがアクセスする共有リポジトリがあり、多くのプロジェクトが共通のコードを使おうとしています。 +* 誰かが(またはどこかのプロジェクトが)最初にコードを書き、リポジトリにコントリビュートしました。 +* 共通コードは、どのプロジェクトにおいても、成果物全体のうちのわずかな割合になります。 +* 各プロジェクトには、それぞれ独自の納期、成果物があり、別の顧客がいます。 +* このパターンは、これらの状況のいずれにも当てはまります。 + * **強いコードへのオーナーシップ**: つまり、共有リポジトリへのすべての変更は、リポジトリの所有者によって承認されなければなりません。 + * **弱いコードオーナーシップ**: つまり、誰も本当にコードを所有していません。 + * **慈善のスポンサー**が**いない**: つまり、インナーソースの方法で共通コードを整理するためのリソースを提供する組織や幹部がいません。 + +## 組織に働く力学 + +コードを利用可能にしたプロジェクトには、ひとつのニーズがあります。そのニーズは、一部の受けての組織が望んでいるものと似ていますが、まったく同じではありません。コードに関する要件は、実際の顧客のニーズから導き出される必要があります。 + +異なる顧客のニーズが非常によく似ることはよくありますが、顧客によって表現が異なったり、重みが異なったりすることがあります。例えば、ある顧客はとある方法で結果を表示し、他の顧客は逆の順序で結果を表示することを望むような場合があります。両者の変換は簡単ですが、一方のケースで追加のコーディングが必要になり、その結果として、結果を計算するモジュールを両方の顧客で再利用することができなくなります。 + +多くの顧客は、サプライヤーに何が必要かを知るための手助けを望んでいます。この会社では、多くの「システムエンジニア」が製品の要求事項を書いています。これらの要件は、製品の開発を導くために顧客のニーズを抽出したものであると考えられています。コードの再利用は、会社の時間とお金を節約するための重要な目標になっています。 + +多くの顧客は、サプライヤーが必要なものを知るのを手伝ってくれることを望んでいます。同社には、製品の要件を作成するための多くのシステムエンジニアがおり、それらの要件は製品開発の指針となる顧客ニーズの抽出物であるとされています。コードの再利用は、会社の時間とお金を節約するための重要な目標です。 + +## ソリューション + +この問題を解決するには、2つの側面があり、並行して行う必要があります。 + +1. あるプロジェクトの要件を満たすコードが、他のプロジェクトのニーズも満たすように、プロジェクトの要件を調整する +1. コードをリファクタリングして、多くの使用プロジェクトが要件に同意できるような小さな断片にする。 + +さらに、サプライヤーに要件の解明を助けてほしい顧客を活用します。 コンポーネントを変更するのではなく、顧客との交渉中に要件の調整を行い、顧客の要件に影響を与えます。 +上記の例では、サプライヤーは両方の顧客が同じことを望んでいることを認識できるように支援し、同じ形式で結果を受け入れることに同意すれば、すべての人の労力(およびお金)を節約できます。 + +![Common Requirements](../../../assets/img/CommonReqtsv2.jpg) + +## 結果の状況 + +これには、要件の変更について顧客と交渉する必要がある場合があります。そして、変更には要件を調整するために営業チームと製品マネージャーの関与が必要になる場合もあります。また、顧客は変更の同意の代わりに、割引などのインセンティブが必要になる場合があります。 + +これに関連する課題(新しいパターンの可能性)として、インナーソースを採用しているとある企業で報告されている「循環型ストーリーライティングの試行」があります。 +これは、端的に言うと以下のようなことです。 + +* 開発者は、ある方法で問題を解決するためにストーリーを書きます。 +* プログラムマネージャーはそのストーリーを自分たちのニーズをよりよく表現するために書き直します。しかし、開発者のもとに戻ってきたときには、開発者はそれが自分たちが最初にやりたかったことだと認識しておらず、そのため実装に躊躇してしまいます。 +* このパターンの解決策は、開発者やプログラムマネージャーの陣営だけでなく、プロジェクト全体でストーリーの修正が理解されるように、プランニングの際により多くの人を巻き込むことが挙げられます。 + +## 事例 + +* 大手通信事業者 + +## ステータス + +* Structured + +## 著者 + +Robert Hanmer + +## 謝辞 + +* Manrique Lopez +* Daniel Izquierdo +* Tim Yao +* Sebastian Spier + +## 翻訳の履歴 + +- **2022-06-02** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) diff --git a/translation/ja/patterns/communication-tooling.md b/translation/ja/patterns/communication-tooling.md new file mode 100644 index 000000000..bab107799 --- /dev/null +++ b/translation/ja/patterns/communication-tooling.md @@ -0,0 +1,66 @@ +## Title + +コミュニケーションツーリング + +## Patlet + +インナーソースのプロジェクトは、開発チームの外で使用されていますが、ユーザーはヘルプを得たり、プロジェクトチームと連絡を取ったりするのに苦労しています。 このアイデアは、ディスカッションが可視化され、アーカイブされ、検索可能になることを可能にする標準的なコミュニケーションツールを設定し、文書化することです。 + +## 状況 + +チームは別のチームのコンポーネントに依存しており、そのコンポーネントにコントリビュートしたいと思いっています。コミュニケーションは文書で行われる場合でも、1対1で行われています。 + +## 問題 + +チームは、そのコンポーネントのダウンストリームユーザーからのコントリビューションを受け入れることができます。しかし、調整とコミュニケーションはアドホックな方法で行われ、支離滅裂な情報が共有されたり、回答が遅れたり、コントリビューターが明確な回答を受け取る前に複数のホストチームのメンバーに問い合わせをしたりすることがあります。 + +## 組織に働く力学 + +* ホストチームはコントリビューションを受けることに興味があり、コントリビューターを指導することに積極的です。 +* チームは口頭でのコミュニケーション文化が強く、プロジェクト特有の非同期コミュニケーションチャンネルを設定する経験は浅いです。 +* コミュニケーションチャネルは、連絡を取るべき特定のグループと連携しているかもしれませんが、コミュニケーションの目的によって連携しているわけではありません。 + +## ソリューション + +ホストチームは、社内で公開され、アーカイブされ、検索可能で、リンク可能なコミュニケーション・チャネルを提供することの利点を明確にする必要があります。 + +インナーソースプロジェクトのコミュニケーションチャネルを合理化する際の目標は、特定の人々の周りではなく、トピックの周りのコミュニケーションを調整することであるべきです。 + +* プロジェクトは、ホストチームのメンバーだけでなく、ダウンストリームユーザーやコントリビューターもフォローできるように、構造化されたコミュニケーション、意思決定、進捗追跡が透過的に行われる独自のイシュートラッカーを持っている必要があります。 +* プロジェクトは、あまり厳密でない構造を持つ1つ以上のディスカッションチャンネルを持つべきです。一般的に、これはメーリングリスト、オンラインフォーラム、あるいはアーカイブされたチャットチャンネルになります。通常、プロジェクトのためのチャンネルは1つで十分ですが、トラフィックが増えすぎた場合は、プロジェクトの使用に関する議論とプロジェクトの開発に関する議論を分けることが有用です。 +* さらに、プロジェクトは[トラステッドコミッター](./trusted-committer.md) の間で機密のやりとりができるプライベートチャンネルを一つ持つべきです - たとえば、ホストチームにさらにトラステッドコミッターを追加するなどです。このチャンネルは、デフォルトではオープンで、非常に稀な状況下でのみ非公開になるように、細心の注意を払って使用されるべきです。 + +文章での共有のチャンネル以外でもコミュニケーションは可能ですが、できるだけ多くの情報を非同期チャンネルにつなぐべきです。 + +すべてのコミュニケーション・チャンネルはプロジェクトの `README.md` で文書化されるべきです。ホストチームのメンバーは、個人的に受けた質問を公式のコミュニケーションチャンネルに戻すよう努力する必要があります。 + +## 結果の状況 + +公式の非同期コミュニケーションチャネルを設定し、一貫して使用することで、同様の質問が再び出てきたときに再び参照できる受動的なドキュメントのベースレベルを作成することができます。 + +コミュニケーションがオープンに行われることで、他の人も簡単にプロジェクトの進捗を追うことができ、積極的に貢献することができます。また、他の参加者が潜んで読んでいることで、参加するための障壁が低くなり、コントリビューションを受ける可能性が高くなります。 + +質問に対する回答が公開されることで、より多くの人が自分の視点を追加し、全体像を把握することができます。これは、ホストチームのメンバーだけでなく、プロジェクトのユーザーも含みます。 + +非同期チャネルでコミュニケーションをとることで、タイムゾーンや会議のスケジュール、チームのルーチンなど、異なるスケジュールの参加者がプロジェクトに有意義に貢献することができます。 + +このようなチャンネルで質問に答えることは、他のチームメンバーがそれを聞いて追加情報を提供できるだけでなく、同じ質問をした他のユーザーが前回の回答を見る(または後で見つける)ことで、説明を繰り返す必要性を低くすることを意味します。 + +## 事例 + +* Europace AG +* Paypal Inc. + +## 著者 + +Isabel Drost-Fromm + +## ステータス + +* Structured +* Drafted in December 2019. + +## 翻訳の履歴 + +- **2022-06-06** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/contracted-contributor.md b/translation/ja/patterns/contracted-contributor.md new file mode 100644 index 000000000..e5fc2cbbf --- /dev/null +++ b/translation/ja/patterns/contracted-contributor.md @@ -0,0 +1,92 @@ +## Title + +コントラクトコントリビューター + +## Patlet + +インナーソースにコントリビュートしたい社員がいますが、彼らの直属の上司はその活動に抵抗を示しています。正式な契約と合意をすることによって救済することができるかもしれません。 + +## 問題 + +中間管理職によるサポートがなければ、コントリビューターの総数や、インナーソースイニシアチブによって生み出されたコントリビューションの量と価値は、トップレベルの経営陣の期待を下回る可能性が高いでしょう。これは、[正式なコミュニティリーダー - Dedicated Community Leader](dedicated-community-leader.md)への十分な資金提供や権限付与がない場合、さらに増幅される可能性が高くなります。 これでは、トップレベルの経営陣がインナーソースの活動やアイデアを放棄してしまう危険性があります。 + +## 状況 + +ある大企業が、インナーソースイニシアチブを開始しました。このイニシアチブの主な目標は、分散ソフトウェア開発の効率を高め、トピックやビジネスユニットに関係なく、すべての社員がインナーソースプロジェクトに自発的にコントリビュートできるようにすることで、イノベーションを促進することです。 + +トップレベルの経営陣は、インナーソースイニシアティブを支持し、ボード上にあります。彼らにとって、インナーソースイニシアチブは、イノベーションと効率性を促進するための多くのイニシアチブの1つに過ぎませんが。彼らは、インナーソースに資金とエリアリーダーに対するキャパシティを提供し、予算がどのように使用されるかについて主に自治を与えています。また、取り組みの幅と期間を限定し、期待通りの成果が得られることが証明されるまで、定期的な見直しも行っています ([レビュー委員会](./review-committee.md)を参照)。 経営トップ層は、様々な社内会議でインナーソースを支持することを表明しています。 + +しかし経営トップは、中間管理職に対して、従業員が部門横断的なインナーソースの活動に参加することを許可したり、動機付けるような権限を与えたり、インセンティブを与えるまでには至っていません。さらに、すべてのアソシエイトのキャパシティは、通常、勤務時間の100%をインナーソース以外のプロジェクトに割り当てられています。組織横断的なコラボレーションはまだ一般的ではなく、直属マネージャーは通常、自分の組織外に目標を持っていません。 +一方で、インナーソースのプロジェクトに貢献するのは、自由時間ではなく、勤務時間内に行われることが期待されています。 + +## 組織に働く力学 + +- マネージャーは、ビジネスユニットの結果に対して責任を負います。 スタッフをインナーソースアクティビティに参加させると、ビジネスユニットの外部でコントリビューションすることに時間を費やす可能性があり、ユニットのキャパシティが効果的に減少します。 これにより、マネージャーが目標を達成または超えることが難しくなる可能性があります。 +- 直属のマネージャーと人事は、一般的に部下のパフォーマンスをビジネスユニットの目標に対して判断します。これは、インナーソースコミュニティの目標と一致していない可能性があります。 +- 直属のマネージャーがトップ層の後方支援を受けていると思っていない場合、他のビジネスユニットに貢献するインナーソースアクティビティにスタッフを参加させる可能性は低くなります。 +- 直属のマネージャーがコントロールしにくく、さらに作業の透明性が低い場合、彼ら・彼女らの部下がインナーソースのプロジェクトにコントリビュートできる可能性は低くなります。 +- インナーソースでの正式な作業が管理および整理されていないほど、正式なプロセスに慣れている直属のマネージャーが、従業員のインナーソースの活動へのコントリビューションを承認する可能性は低くなります。 +- 社員はインナーソースプロジェクトへのコントリビューションに多くの時間を費やしますが、それらの活動は彼・彼女の日常業務に利益をもたらすことはありません。そのため、彼のビジネスユニットのチームメイトの作業負荷が増加してしまいます。 +- 個々のコントリビューターは、おそらく社内の専門的なネットワークを強化し、彼ら・彼女らのコントリビューションの技術分野における知識と経験を得るための機会としてインナーソースに参加することを検討しています。 + +## ソリューション + +コントリビューター、その直属のマネージャー、および中央で資金提供され運営されているインナーソースガバナンスオフィス(ISGO) の間で正式な契約を締結します。 ISGO に、契約期間内にコントリビューターと契約したビジネスユニットに払い戻しを依頼します。 + +- 契約では、インナーソースで社員の作業時間の最大割合を指定します。 +- 契約では、コントリビューターのビジネスユニットでの作業がインナーソースでの作業よりも優先されることを明確に述べています。 +- 契約では、契約で指定された最大割合の作業量をインナーソースプロジェクトでで必要はないことを述べています。 +- 契約では、コントリビューター、コントリビューターの直属の上司、ガバナンスオフィス、コントリビューターがコントリビュートするコミュニティの[正式なコミュニティリーダー](dedicated-community-leader.md)によって署名されています。 +- ガバナンスオフィスは、コントリビューターと直属のマネジャーの間で時間に関するコンフリクトが生じた場合、その仲介を行うことを提案します。 +- [正式なコミュニティリーダー](dedicated-community-leader.md)は、20%以上の活動をインナーソースに充てている契約コントリビューターのパフォーマンスレビューに参加するか、意見を提供します。 + +![Contracted Contributor](../../../assets/img/contracted-contributor.png) + +## 結果の状況 + +正式な契約と中央資金による払い戻しは、インナーソースイニシアチブのための組織のサポートを説得力を持って伝えることになり、またそれに署名するために中間管理職の権限を与えることになります。 + +- 開発キャパシティを払い戻すための企業資金のビジネスユニットへの割り当ては、インナーソースが組織によって価値があると見なすことになります。また、エグゼクティブの後方支援があり、彼らもそれをサポートすることが期待されていることを直属のマネージャーにに伝えることにもなります。 +- 正式な契約は、インナーソースで仕事が専門的に管理されていることを意味し、信頼につながります。 +- 正式な契約により、透明性が向上し、社員のビジネスユニットおよびインナーソースプロジェクトで利用可能なキャパシティの概要がわかりやすくなるため、「過剰なリソースの提供/計画キャパシティ」に関するリスクが軽減されます。 + +正式な契約は、コントリビューターやコミュニティにとっても有益です。 + +- 安定したコントリビューターのグループがあれば、そのうちの何人かが最終的に[トラステッドコミッター](./trusted-committer.md) のロールに到達する可能性が高くなります。 +- 正式な契約は、インナーソースの活動への参加に関連するコンフリクトを解決するための基礎を提供します。(注: 調停は、対応する文化を持つ一部の企業のみに成功する可能性が高いことにご注意ください) + +## 事例 + +- BIOS at Robert Bosch GmbH + +## ステータス + +* Structured + +## 著者 + +- Georg Grütter (Robert Bosch GmbH) + +## 謝辞 + +- Diogo Fregonese (Robert Bosch GmbH) +- Robert Hansel (Robert Bosch GmbH) +- Jim Jagielski +- Tim Yao +- Cedric Williams +- Klaas-Jan Stol +- Padma Sudarsan +- Nick Stahl +- Ofer Hermoni +- Robert C. Hanmer + +## Changelog + +- **2016-10-25** - first review +- **2017-05-09** - rework +- **2017-09-08** - second review, final rework and merged +- **2021-02-27** - fixing issues with display of the pattern in the book + +## 翻訳の履歴 + +- **2022-06-06** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) diff --git a/translation/ja/patterns/core-team.md b/translation/ja/patterns/core-team.md new file mode 100644 index 000000000..aed377d12 --- /dev/null +++ b/translation/ja/patterns/core-team.md @@ -0,0 +1,97 @@ +## Title + +コアチーム + +## Patlet + +インナーソースのプロジェクトが広く必要とされていても、プロジェクトが難しいためにコントリビューションや活用に支障をきたす場合があります。プロジェクトの基本的な項目を専門に担当するコアチームを設立してください。コアチームの作業により、コントリビューターは自分のシナリオに価値をもたらす機能を追加し、使用することができます。 + +## 問題 + +* プロジェクトにコントリビュートすることが困難な場合、以下のようなことが原因として考えられます。 + * ローカルでプロジェクトを実行できない。 + * ドキュメントが貧弱 + * コードが複雑 + * テストが不適切である +* プロジェクトを使用するのが困難な場合、以下のようなことが原因として考えられます。 + * ドキュメントに不備がある + * バグが頻繁に発生する + * セットアップが直感的でない + +## ケーススタディ + +誰もが依存する中心的なプロジェクトがあります。「なんて素晴らしいインナーソースのための候補でしょうか!」 +しかし残念ながらこれまでプロジェクトは有機的に成長し、様々なコントリビューションと追加が無計画に行われてきました。今では、誰も理解できず、誰もが触れることを恐れている、厄介で厚いコードの沼になっています。 +明らかにオーバーホール(リファクタリング、テスト、ドキュメンテーションなど)を行うべきなのに、誰もがその作業を必要とし、望んでいるにもかかわらず、誰もそのための時間を取らないのです。 + +## 状況 + +* 多くのチームがそのプロジェクトを必要としています。 +* プロジェクトに大きな技術的負債があります。 +* プロジェクトの採用やイテレーションは遅いです。 +* プロジェクトとコントリビューションのエコシステム全体に対して責任を持つオーナーやメンテナが存在しません。 + +## 組織に働く力学 + +* コントリビュートするチームは皆忙しいので、自分たちにすぐに利益が出る仕事を優先します。 +* プロジェクトが成長するにつれ、使用や変更が難しくなるのは当然の傾向です。 + +## ソリューション + +他の人が簡単に参加でき、コントリビュートできるようにこのプロジェクトを維持することを仕事とするコアチームを形成します。このコアチームは、健全な利用やコントリビューションのエコシステムに必要な作業を行います。この重要な仕事は、コントリビューションとして優先されない傾向があります。この種の作業のカテゴリには、コミュニケーション、ローカル環境、DevOpsインフラストラクチャが含まれます。 +以下はその具体例です。 + +* 本番環境のバグ +* ドキュメンテーション +* オンボーディングチュートリアルとサンプル +* 自動化されたテスト +* CI/CD +* ローカル環境 +* モジュール化 +* バージョニング +* モニタリング +* 新しいクラス/機能のカテゴリを開拓する + +これらの各項目は、健全な製品エコシステムにとって非常に重要であるにもかかわらず、貢献として優先されることはまずないでしょう。 +コアチームは少人数の、フルタイムまたはパートタイムで構成することができます。その選択は、必要な作業量、リソースの利用可能性、組織の文化に依存します。最も重要な考慮点は、組織が他のチームと同じように権限を与え、責任を負わせることができるようにチームを編成することです。 +その中心的な役割から、コアチームのメンバーはほぼ常に**トラステッドコミッター**の役割も果たすべきです (この概念については、[ラーニングパス][tc-learning-path]と [パターン][tc-pattern] を参照してください)。トラステッドコミッター の役割は、他のメンバーがプロジェクトに貢献したり利用したりするのを促進することに主眼が置かれていますが、コアチームのメンバーは定期的にプロジェクトにも貢献します。コアチームには、貢献を決定するような独自のビジネスアジェンダはありません。彼らは、他の人がプロジェクトを利用し貢献するために何が最も役に立つかを考えて、取り組むべきことを決定します。 + +この目標を継続的にリマインドさせるためには、コアチームに定期的に以下の項目を報告してもらうのがよいでしょう。 + +* そのプロジェクトを使用しているアクティブなチームの数 +* プロジェクトに対するチーム外からの貢献の数 + +これらのメトリックに継続的に焦点を当てることで、コアチームは自然と、プロジェクトの周りに繁栄するインナーソースエコシステムを作成するための適切な作業に優先順位を付けるようになります。 + +![Responsibilities of Core Team and InnerSource Contributors](../../../assets/img/core-team.png) + +## 結果の状況 + +* プロジェクトを利用しコントリビュートすることが容易になります +* 多くのチームがこのプロジェクトを利用し、貢献するようになります +* コアチームの成功は、他のプロジェクトとの相互作用とプロジェクトへの対応という観点から定義されています。 + +## 理論的解釈 + +コアチームを分離し、このようにタスクを与えることで、プロジェクトを成功させるために必要なギャップを埋めることができます。 +コアチームはそのギャップを埋め、コントリビューションのエコシステムが健全であるよう、潤滑油の役割をします。 + +## 事例 + +Nike は、再利用可能なCI/CDパイプラインを中心としたインナーソースの取り組みを管理するためにこのパターンを導入しました。 + +## ステータス + +Structured + +## 著者 + +[Russell R. Rutledge](https://github.com/rrrutledge) + +[tc-learning-path]: https://innersourcecommons.org/ja/learn/learning-path/trusted-committer/ +[tc-pattern]: ./trusted-committer.md + +## 翻訳の履歴 + +- **2022-06-01** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-21** - レビュー [@hirotakatoya](https://github.com/hirotakatoya) diff --git a/translation/ja/patterns/crossteam-project-valuation.md b/translation/ja/patterns/crossteam-project-valuation.md new file mode 100644 index 000000000..755aabc4e --- /dev/null +++ b/translation/ja/patterns/crossteam-project-valuation.md @@ -0,0 +1,102 @@ +## Title + +クロスチームプロジェクト評価 + +## Patlet + +会社の収益に直接的な影響を提供していないクロスチームのインナーソースプロジェクトの価値を評価して社内に売り込むことは困難です。 +ここでは、あなたのプロジェクトの価値を明確に表現し、それを大きくするためのデータ駆動型の方法を紹介します + +## 状況 + +* あなたは、社内のプラットフォームとして機能するクロスチームを担当しています。 +* クロスチームプロジェクトは、企業の収益に直接的な価値をもたらすものではありません。 + +## 問題 + +チーム横断的なプロジェクトは、会社に非常に大きな影響を与える可能性がありますが、データに基づいた形で表現することは困難です。 +その結果、真の価値を生み出さないプロジェクトを追求してしまったり、本来なら大きな価値を生むはずのプロジェクトに資金を投入しなかったりすることがよくあることはご存知の通りでしょう。 + +## 組織に働く力学 + +* プロジェクトが資金を得るためには、会社のリーダーシップに価値(客観的または主観的)を示す必要があります。 +* チーム横断的なプロジェクトの価値は、複数の最終事業部門に分散しています。 +* このように分散しているため、クロスチーム・プロジェクトの価値を直接測定することは困難になっています。 + +## ソリューション + +チーム間のプロジェクトを評価する方法のパターンとモデルを設定します。このようなモデルは、会社にとって価値の高いコラボレーションに焦点を合わせて拡大するために必要なツールを提供します。 +チームをまたがるすべてのプロジェクトにおける価値の核となるのは、離れるよりも一緒に多くのことを成し遂げることができるという考えかたです。 チーム間の取り組みに価値を与えることは、一緒に行われていることの量を定量化するための演習にもなります。 +生産性に関する実際の差は、ドメインやプロジェクトによって異なります。ここではモデルを作成して計算できる一般的なプロセスがありますので以下で紹介します。 + +### 解説 + +まずあなたのドメインにおける特定分野の専門家からなる小さなチームを編成します。その専門家チームで、プロジェクトの成果物を利用するそれぞれの人について、以下の4つのことを見積もってください + +- プロジェクトの成果物をユーザーが使うのにどのくらい時間がかかりますか? +- そうでなければ、あなたのプロジェクトのアウトプットの価値をユーザー自分たちのものにするために、どれくらいの時間がかかりますか? +- プロジェクトの成果物の何パーセントが、実際に彼らにとって有用ですか? +- 自社で開発したソリューションのメンテナンスに、継続的(理想は使用ごと)にどれだけの時間を費やすことになりますか? + +これらの見積もりを行う場合、アクティビティにかかる時間を正確に知ることは不可能です。また、それはあなたの目標ではありません。 正確さではなく、これらの見積もりに最悪の場合の限界を設定するように努める必要があります。専門家のグループがお互いに「どれくらいの時間がかかるかは正確にはわかりませんが、少なくともこれだけだということには同意できます」と言うことができるという考えです。 具体的には、プロジェクトのアウトプットを消費するための最大の妥当な時間と、消費者が独自のソリューションを自分のものとして使用、および維持するための最小の妥当な時間を見積もる必要があります。 + +自前でソリューションを開発する(ホームロール)場合のコストについては、一つ注意点があります。ソリューションの自作にかかるコストは、必ずしも共有ソリューションの作成コストと同じとは限りません(実際、非常にまれです)。 同じ機能であれば、チーム横断的な共有ソリューションの構築に必要なモジュール性と品質により、一度だけ使用する迅速でハードコードされた実装よりも明らかに高い投資となることがよくあるのです。 + +### 数式 + +ワーストケースを設定すると、単純な計算式でチーム横断的なプロジェクトの成果物を評価することができます。 + +``` +[節約した時間] - [投資した時間] + +([新しいオンボーディングの数] * [自分のものにするためのコスト] * [成果物のうち使える機能の割合] + [利用数] * [利用ごとのメンテナンスコスト]) - ([新しいオンボーディングの数] * [オンボーディングのコスト]) + +[新しいオンボーディングの数] * ([自分のものにするためのコスト] * [成果物のうち使える機能の割合] - [オンボーディングのコスト]) + [利用数] * [利用ごとのメンテナンスコスト] +``` + +### 解説 + +一見このプロセスには厳密さがあるように見えますが、チーム横断的なプロジェクトの成果を正確に測定する方法を提供するものではありません。 +ただし、実際には、この作業に資金を提供する方法を適切に決定するためのフレームワークが提供されます。 +上記の説明に従って適切で妥当なデータを取得したら、少なくとも次の3つのレベルのうち、小さい方までプロジェクトを実行するための専用の開発時間に資金を提供する必要があります。 + +1. 上記の式によって節約された実際の時間。 公式が実際に節約された時間数よりも少ない数を生み出すと私たちは皆確信しています。そのため、その時点までのプロジェクトへの資金提供はあなたにとって確実な勝利であると確信することができます。 +1. チーム間のプロジェクトへのインナーソースのコントリビューションをサポートするためにかかる時間。コントリビューターは、一度限りのワークを提供することが多いでしょう。そのワークを共有の場所に持っていくための時間に投資することには価値があります。 +1. あなたが心地よく進められるものなら何でもかまいません。評価式を持つことの意図的な副次効果として、ユーザーに価値を提供する重要ポイントの測定を自然に強制することができます。 + +それらの測定値を理解し、そのまま使うことで、プロジェクトの価値を直感的に理解することができます。 +この評価手法が正確さに欠けることを心配される方もいらっしゃるかもしれません。このプロセスでは正確な測定値が得られなくてもかまいません。ただ、以下2つの目的を達成するのに十分な精度があることが重要です。 + +1. チーム横断的な取り組みを組織し、資金を提供している人々に、起こっていることの価値を表す手段を提供します。 +1. チーム横断的な取り組みのうち、どの分野がより高い価値を持ち、優先的に追求されるべきかを関係者が知ることができるようにします。 + +実際には、これらの評価が現実と一桁以内の誤差である限り、これらの目的を満たすのに十分な精度であると言えます。 +ドキュメント冒頭の「**問題**」で述べたような場当たり的な評価(およびその結果生じる影響)に比べ、現場での結果は頭一つ抜きん出たものになるでしょう。 + +## 結果の状況 + +* チーム横断型プロジェクトの価値と資金調達について、リーダーシップと議論するためのデータ駆動型の手段になります。 +* クロスチーム・プロジェクトに関する主要な指標を素のデータの形で計測することができます。 +* クロスチーム・プロジェクトがどのように価値を提供するかを定義することで、実際に企業にとってより大きな価値を生み出すことにつながる傾向があります。 +* 一般的に成功したプロジェクトの周辺でバズが生まれます。 + +## 事例 + +* Nike + +## ステータス + +* Structured +* Proven in multiple domains. + +## 著者 + +* Russ Rutledge + +## Acknowledgement + +* Jeremiah Wright さんは、クロスチーム・プロジェクトを、開発者の時間という"通貨"を扱う社内ビジネスとして考えるように教えてくれました。 + +## 翻訳の履歴 + +- **2022-06-03** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) diff --git a/translation/ja/patterns/dedicated-community-leader.md b/translation/ja/patterns/dedicated-community-leader.md new file mode 100644 index 000000000..3929158a8 --- /dev/null +++ b/translation/ja/patterns/dedicated-community-leader.md @@ -0,0 +1,91 @@ +## Title + +正式なコミュニティリーダー + +## Patlet + +インナーソースの取り組みを成功させるために、コミュニケーションとテクニカルの両方のスキルを持つ人をコミュニティのリーダーとして選ぶ。 + +## 問題 + +新しいインナーソースのイニシアチブがその影響を拡大するために適切な[コミュニティリーダー](http://www.artofcommunityonline.org/)を持っていることを確認するにはどうすればよいか +間違った人を選択し、またはそれらのために十分なキャパシティを提供しないことは、無駄な努力と、最終的に新しいインナーソースイニシアチブの失敗を引き起こすリスクになる + +## ケーススタディ + +次のようなストーリーを考えてみましょう。ある企業が、組織の境界を越えたコラボレーションを促進するために、インナーソースイニシアチブを始めたいと考えています。彼らは、範囲を限定した実験的な段階から始めることを決定しました。経営陣は、最初のインナーソースコミュニティに適したパイロットトピックを選択し、組織全体の多くのビジネスユニットからのコントリビューションを期待しています。会社はまだ完全に計画をできていなかったので、新入社員をコミュニティの責任者に指名し、業務時間の50%を割り当てました。6か月後、コミュニティにはわずかなコントリビューションしかなく、そのほとんどはひとつのビジネスユニットからのものでした。そこで、コミュニティリーダーを社歴の長い人物に代え、今度は30%の時間しか割かないようにしました。さらに6ヶ月後の結果は、コントリビュートがわずかに増加したのみでした。同社は、部門を超えたコラボレーションを増やす目標を達成するのに、インナーソースが役立つと確信できなくなり、インナーソースを放棄しました。 + +## 状況 + +- この会社は大企業で古い会社で、またオープンソースやその他のコミュニティベースのワークモデルの経験がありません。企業文化は古典的なトップダウン経営スタイルとして最もよく特徴づけられています - それは一般的にコミュニティ文化とは相反するものです。 +- トップレベルの支持者とスポンサーがいる一方で、会社の中間管理職はまだインナーソースの価値を納得できていません。 +- 経営陣は、パートタイムのコミュニティ・リーダーに対し、限られた予算以上のリソースを提供することに納得していませんでした。 +- 最初に選ばれたコミュニティのリーダーは、オープンソースの作業モデルについてほとんど、あるいは全く経験がありません。 +- 最初に選ばれた開発者コミュニティのリーダーは、社内に広いネットワークを持っていません。 + +## 組織に働く力学 + +もし、企業がインナーソースの予算とキャパシティの面で初期のインナーソースコミュニティに大幅に投資していない場合、インナーソースへのコミットメントの信頼性は疑わしいと認識されるかもしれません。期待通りに実行されていないプロジェクトやイニシアチブに対する伝統的な管理文化を持つ企業の一般的な動きは、そのリーダーを交換することでしょう。コミュニティを巻き込むことなく、そして功績至上主義の原則に従わずに活動を行うことは、現在の企業文化とコミュニティ文化との間の摩擦を強調することにつながり、インナーソースへの企業のコミットメントをさらに弱体化させます。 +インナーソースプロジェクトにおける価値の貢献は、従来のプロジェクト管理方法に慣れ親しんでいる多くのマネージャーにとっては明らかではありません。これらのマネージャーは、通常は非インナーソースプロジェクトから高い需要があるトップクラスの人物の1人を、作業時間のかなりの割合でインナーソースプロジェクトに割り当てる可能性が低くなります。 +コミュニケーションは、コミュニティリーダーの日常業務のかなりの割合を占めています。同時に、担当者は初期開発の先頭に立つ必要があるでしょう。限られたキャパシティに直面して、経験の浅いリーダーは開発に集中し、コミュニケーションを怠る傾向があります。コミュニティリーダーが連絡を取りにくい場合や、時間不足のためにフィードバックや質問への回答が遅い場合、潜在的なコントリビューターが最初のコントリビューションをしてコミュニティにコミットするための障壁ははるかに高くなります。さらに技術的に経験の浅いリーダーは、企業で目立つトップパフォーマーと比べると、経験豊富なコントリビューターを引き付けて維持するのに苦労する可能性があります。 +もしコミュニティが十分に速く成長し、十分なスピードを手に入れることができなければ、インナーソースの可能性を説得力を持って示すことができない可能性があります。 +もし会社が伝統的な管理手法に慣れた経験豊富なプロジェクトマネージャーやラインマネージャーをコミュニティリーダーに選んだ場合、その人は功績至上主義で模範を示すのではなく、リソース配分、構造、報告ルートといった伝統的な管理テーマに焦点を当てる可能性が高いです。これは、開発者の目から見たインナーソースイニシアチブの信頼性を損ねることになります。 + +## ソリューション + +以下のようなコミュニティリーダーを選択します。 + +- オープンソースの作業モデル、または類似のコミュニティベースの作業モデルの経験がある +- 自然なリーダーとして活動するために必要なソフトスキルを持っている +- 模範を示して指導し、コミュニティの功績至上主義において自分の立場を正当化することができる +- 優れたネットワーカーであること +- コミュニティーのメンバーにインスピレーションを与えることができる +- 経営陣と開発者の両方に効果的にコミュニケーションをとることができる +- コミュニティ活動の経営的な面を扱うことができる + +コミュニティリーダーには、コミュニケーションや開発など、自分の時間の100%をコミュニティ活動に捧げることができるよう、権限を与えましょう。コミュニティ運営に変化をもたらす際には、コミュニティの意見に耳を傾ける必要があることを経営陣に伝え、理想的には、コミュニティが自らコミュニティリーダーを指名できるようにすることが望ましいです。 + +## 結果の状況 + +上記の能力を持つコミュニティのリーダーは、会社のインナーソースへのコミットメントを人前に出て体現することになります。彼のネットワーク内の他の同僚は彼のリードに従い、インナーソースに貢献する可能性が高くなります。 + +時間が経つにつれて、リーダーは、開発者の安定したコアチームを構築することができ、したがって、インナーソースプロジェクトの成功の可能性を高めることができます。 +インナーソースの可能性について社内の十分な数のオーディエンスを納得させることによって、リーダーは企業文化をよりコミュニティ中心のものにする変革に大きく貢献することになります。 + +優秀で熱心なコミュニティリーダーを持つことは、インナーソースを成功させるための前提条件です。しかし、それは銀の弾丸ではありません。インナーソースには、予算、法律、財政、あるいはその他の組織的な課題など、コミュニティリーダーが取り組める以上の課題がたくさんあります。 + +## 事例 + +_Robert Bosch GmbH における BIOS_。Bosch社のインナーソースは、大半の場合、イノベーションを高めることを目的としており、かなりの割合で内部向けのプロダクトを扱っていました。このパターンは、資金不足のため、現在Bosch社では使われなくなりました。 + +## その他の呼び方 + +Dedicated Community Manager + +## ステータス + +* Structured + +## 著者 + +- Georg Grütter (Robert Bosch GmbH) +- Diogo Fregonese (Robert Bosch GmbH) + +## 謝辞 + +- Tim Yao +- Padma Sudarsan +- Nigel Green +- Nick Yeates +- Erin Bank +- Daniel Izquierdo + +## Changelog + +- **2016-11-06** - 1st review +- **2017-04-06** - 2nd review + +## 翻訳の履歴 + +- **2022-06-01** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-21** - レビュー [@hirotakatoya](https://github.com/hirotakatoya) diff --git a/translation/ja/patterns/document-your-guiding-principles.md b/translation/ja/patterns/document-your-guiding-principles.md new file mode 100644 index 000000000..e2dfd53b8 --- /dev/null +++ b/translation/ja/patterns/document-your-guiding-principles.md @@ -0,0 +1,190 @@ +## Title + +基本原則ガイダンスの文書化 + +## Patlet + +「オープンソースのベストプラクティスを組織内に適用する」という通常のインナーソースの説明は、オープンソースのバックグラウンドがない人々にはうまく機能しません。 +解決策として、インナーソースの最も重要な原則を文書化し広く公開しましょう。 + +## 問題 + +この組織は、インナーソースをより大規模に展開しようとしています。この取り組み自体はオープンソース愛好家のなかで始まりました。現段階の目標は、オープンソースの経験がない人たちからの賛同を得ることです。その人たちに伝えるためのツールとして「オープンソースのベストプラクティスを適用する」という典型的なスローガンは最適ではありません。この伝え方では、そもそもインナーソースがなんであるか、また問題の解決のためにどのようなツールを使うべきなのかは伝わりません。結果として、組織におけるインナーソースの適用が遅くなることにつながります。 +チームはインナーソースのゴールが何であるか、そしてどうやったら最適の実装方法を見出せるのかを場当たり的なアイデアをもとに解決しようと試みます。しかしそれはコントリビューターがチームの境界を越え始めたときに混乱を引き起こす結果にも繋がってしまいます。 + +## ケーススタディ + +ある組織での初期の実験では、オープンソースコラボレーションのベストプラクティスが有益であることが示されました。次のステップは、オープンソースの深いバックグラウンドがないチームや個人にそのイニシアチブを移すことです。 +そして今の目標は、インナーソースイニシアチブの目標と、これらの目標達成に向けた明確な道筋を明確に伝えることです。 + +## 状況 + +* インナーソースという言葉が社員の間で広がり始めています。 +* イニシアチブ自体はオープンソースの愛好家の間で始まった取り組みでした。 + +## 組織に働く力学 + +* チームは、インナーソースの重要な側面が何であるかを正確に伝えるのに苦労しています。 +* オープンソースの経験が不足している人々は、オープンソースのベストプラクティスを組織にもたらすことの意味を理解することができません。 +* 日常的にインナーソースのベストプラクティスに従おうとするチームは、自分たちがやっていることが一般的なインナーソースの典型例に沿っているのかを判断するのに苦労しています。 + +## ソリューション + +組織内でインナーソースの取り組みを推進する人は、オープンソースの深いバックグランドを持たず、インナーソースを直感的に理解できていないチームや個人を支援する必要があります。 + +以下の2つの分野を文書化することで、チームや個人に対して明確な情報を提供する必要があります。 + +1. **目的** - なぜ組織はインナーソースを採用するのか? +2. **原則** - どのインナーソースの原則は、これらの課題に対処するのに役立つのか? + +以下のセクションでは、この2つの詳細について説明します。あなたの組織が目的と原則を文書化するために、このセクションはよい出発点になるでしょう。 + +### なぜ組織はインナーソースを採用したいのか? + +かつてよりインナーソースは、組織で発生する一般的な問題を解決するのに役立つことが証明されています。しかし幾多ある組織的な課題のうち、あなたの組織がインナーソースを用いて解決したい課題はなんでしょうか。その問題を特定するためには一般化するのではなく、組織の課題に一致するソリューションを正確に特定するようにしてください。できれば、目に見える変化を求めているチャレンジを特定するのが好ましいです。 + +他の個人や組織がインナーソースのベストプラクティスに従うことによって対処しているいくつかの課題があるので、見ていきましょう。 + +* 強力なオーナーシップを求める文化によって引き起こされる開発のサイロを減らすため +* 健全なコードの再利用を促進することにより、類似の問題の解決に費やす時間を短縮し、イノベーションの速度を向上させるため +* より良いクロスチームのコラボレーションによって開発速度を向上させるため +* 依存関係があるプロジェクトやチームの連携を、ワークアラウンドを開発したり、ただ単純に待つのではなくエンジニアリングにおけるボトルネックを減らすことによって解決するため +* 品質を向上させるため +* 従業員の幸福度を高めるため +* 新入社員の成功の数を増やす +* アクショナブルなドキュメントをつくる + +### どのインナーソースの原則がこれらの課題を解決するのに役立つのか? + +チームがインナーソースがどのような問題に対処するのに役立つかをひとたび理解したら、次のステップは、これらの課題に対処するのに役立つ原則を説明することです。 +基本的なオープンソース開発の原則に基づき、以下のガイドラインが成功に役立つと証明されています。 + +(1) コードは、組織内で透明性を持ってホストされなければなりません。 +ソースコード、ドキュメント、プロジェクト開発に関連するデータは、組織内の誰もが利用でき、簡単に見つけることができる必要があります。 + +(2)機能リクエストよりもコントリビューション + +プロジェクトのすべての関係者は、潜在的なコントリビューターとして扱われ、サポートされます。コントリビューションはリクエストではなく、提案にとどめましょう。 +コントリビューション前にきちんと連携をしておくことにより、無駄な労力を省くことができます。 プロジェクトは摩擦を避けるためにコントリビューションのガイドラインを提供します。 + +(3) 失敗することは学習をするチャンスであるということ + +組織全体で仕事が見えるため、どんなミスもメンバーに見えてしまいます。「ミスは何としても避けなければならない失敗」ではなく「学習のための機会である」という文化が確立されなければなりません。 + +(4) 口頭より文字で伝える + +複数のチームにまたがるプロジェクトでは、潜在的に会議のスケジュールが異なるため、非同期でのコラボレーションを可能にする必要があります。インナーソースのプロジェクトのゴールは、新しいコントリビューターを集めることです。そのため潜在的な将来のコントリビューターがプロジェクトに参加するハードルを下げることが必要であり、セルフサービスでプロジェクトの進捗状況を追跡することができるようにしておく必要があります。プロジェクトに関連するコミュニケーションが同期的なコミュニケーションを介して行われる場合、議論された内容は、ドキュメンテーションのチャネルで透明化しておく必要があります - 最終的な意思決定はそのコミュニケーションチャネルでのみ決定されるべきです。 +このことは副次的な効果として、プロジェクトに新しく参加する人にとって非常に価値のある受動的なベースドキュメンテーションにつながります。 + +(5) 書面によるアドバイスを永続的で検索可能なアーカイブに蓄積できるようにする + +プロジェクトのすべてのコミュニケーション、特に決定事項やその決定に至るまでの議論はアーカイブされる必要があります。また、コミュニケーションは安定したURLで参照できるようにする必要があり、過去のコミュニケーションも、簡単に検索できる形で保存される必要があります。 + +ただし、2つの注意点があります。 + +1. これは構造化された文書に取って代わるものではありません。しかし一方で、構造化されたドキュメントを収集するための出発点として機能もします。 +1. すべてを文書化し、組織全体がアクセスできるようにするというルールには例外があります。人に関する議論やセキュリティに関する議論は機密事項であり、人前で行うべきではありません。 + +(6) **トラステッドコミッター** に対するリワード + +すべての貢献(ソースコード、ドキュメント、バグレポート、議論への意見、ユーザーサポート、マーケティングなど) は歓迎され、リワードの対象になります。プロジェクトをサポートする人は、[トラステッドコミッター](./trusted-committer.md)としてプロジェクトに招待され、全てのトラステッドコミッターのリストは公開されます。 + +## 結果の状況 + +* 組織のメンバーは、インナーソースのベストプラクティスを適用することによって、どのような課題に対処することができるのかを理解しています。 +* オープンソースの経験がないメンバーが、インナーソースプロジェクトの基本的な価値観や原則を理解することができます。 +* オープンソースの経験がないメンバーが、自分たちが日々行っていることを、共通の価値観に照らして確認することができる。 +* 組織の開発手法がオープンソースプロジェクトと類似しているため、組織のメンバーがオープンソースプロジェクトに参加しやすくなります。 + +## 事例 + +### Europace AG + +上記のソリューションに記載されているインナーソースの原則は、ほとんどが Europace の経験に基づいています。 +詳細は[Europace のインナーソース原則](https://tech.europace.de/post/europace-inner-source-prinzipien/)(ドイツ語)をご覧ください。 + +### GitHub + +#### 目的 + +GitHub ではしばしば、チームが自分の担当外の領域に機能を提供するモデルで作業をします。よくある例としては、セールスエンジニアリングが営業におけるブロッカー要素を排除するために機能を提供したり、緊急なニーズに対する特別なプロジェクトがあり、インパクトの強い機能をプロダクト全体に提供したり、チームが複数のエリアにまたがって機能を提供したりすることです。 + +#### 原則 + +全体として、このドキュメントで説明されている原則は、オーナーとなるチームの技術的負債とサポートの負担を増加させないようにすることに焦点を当てています。 + +多くの場合、チームは責任範囲内のサポートとメンテナンスのコストのために遅れており、機能に貢献するための余裕がないため、チームにヘルプが求められています。しかし別のチームによって新機能にかかるサポートの負担や技術的負担が追加されることになると、所有するチームが新機能に取り組む時間がさらに短縮されることを意味するため、それらが正しく行われていることを確認する必要があります。 同時に、私たちはエンジニアが境界を越えて自由に仕事ができる会社を目指しており、ビジネスの優先事項では、コアオーナーシップ以外の分野にコントリビュートすることが求められることがよくあります。 + +これらの原則をまとめると、「見つけたときと同じか、それ以上の状態で残す」ということになります。 + +それを踏まえて、私たちが賛同する原則を以下に紹介します。 + +- 機能負債を抱えるようなMVP(Minimum Viable Product)は避ける。顧客からのフィードバックを得るためにMVPを出荷することは構いませんが、コントリビュートするチームはその機能セットを完成させることを約束しなければなりません。例えば、以下のようなことです。 + - MVP を越えて、ほとんどの顧客を満足させるソリューションにするためのコミットメント + - 新機能の管理を完全にサポートすること (例: コマンドラインの操作のみを提供するのではなく、設定のための UI を提供する) + - APIのみを提供するのではなく UI と API の両方のインタフェースを提供する(またはその逆) + - クラウドとやサーバー環境での動作保証 (補足: GitHub Enterprise Server と GitHub Enterprise Cloud の両方で動く) +- 本番環境へのデプロイまで、またそれ以降も機能作業をサポートする + - インクリメンタルなロールアウトの連携 + - サポートチケットをハンドルする + - 顧客からの(機能やバグに関する)フィードバックに対応するための時間をプランニングする +- 正しい方法で機能を構築する(技術的負債を作らない) + - プロダクトチームおよびエンジニアリングチームとの要件およびソリューションの合意 + - 適切なアーキテクチャと設計 + - 後のデータマイグレーションを避けるために、データが適切に保存されていることを確認する + - 適切なテレメトリの計測が行われていること + - 適切なテストカバレッジが確保されている + - クラウドおよびローカルの本番環境でサポートされている(セットアップ、設定、バックアップ/リストア、マイグレーションなどを含む) + - バグの修正 + - ドキュメントの更新 + +#### エンゲージメント + +エンゲージメントモデルを使用するのは、チームが責任範囲外の領域に機能を提供するときに、チームが実行できる具体的な手順を示すためです。 +GitHubの一般的なエンゲージメントモデルは以下です。 + +- プロダクトオーナーから、機能のセッティングとロールアウトプランの承認を得る +- エンジニアリングオーナー(通常、エンジニアリングマネージャーとディレクター)から、非機能要件(テレメトリ、テストカバレッジ、マルチ環境テストとサポート) への対応を含むエンジニアリング設計の承認を得る +- 新規または変更された要件のレビューとともに、コードレビューを実施する。 + +### Robert Bosch GmbH + +#### 目的 + +Bosch のインナーソース・イニシアチブ (BIOS: Bosch Internal Open Source) は、コラボレーション、学習、イノベーションを促進することに主眼を置いています。 + +#### 原則 + +ボッシュは以下の原則を適用しました。 + +- **オープン性**: BIOS コミュニティへの参入障壁を可能な限り低くします。 +- **透明性**: 徹底的に透明性を高め、仕事上の成果物、コミュニケーション、意思決定を社内の全社員と共有します。 +- **自発性**: BIOSコミュニティに参加し、コントリビュートするかどうかの判断は、各人に任されています。社員は上司に言われたからではなく、自発的な動機で BIOS に参画すべきです。 +- **自己決定**: BIOS コミュニティは、何に取り組むか、いつ取り組むか、どのようなツールやプロセスを使って取り組むかを自由に選択することができます +- **功績至上主義**: BIOSプロジェクトメンバーには、その功績に基づいて、つまりコントリビューションの質と量に基づいて権力が付与されます + +![BIOS Principles](../../../assets/img/bios-principles.png) + +オープン性、透明性、自発性の原則は、本質的な動機によって動く仲間の多様なコミュニティを成長させるのに役立ちました。功績至上主義は、多大な貢献をするための効果的な動機であることが証明されています。 自己決定により、コミュニティは限られた時間を最も効果的かつ効率的な方法でコントリビューションに使用することができました。 + +## ステータス + +Structured + +## 著者 + +* Isabel Drost-Fromm +* Georg Grütter + +## 謝辞 + +* Zack Koppert - GitHub のアプローチを提供していただき感謝いたします。 + +## その他の呼び方 + +インナーソース減速の明示 - Explicit InnerSource Principles + +## 翻訳の履歴 + +- **2022-06-02** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/gig-marketplace.md b/translation/ja/patterns/gig-marketplace.md new file mode 100644 index 000000000..c3fb30a65 --- /dev/null +++ b/translation/ja/patterns/gig-marketplace.md @@ -0,0 +1,79 @@ +## Title + +ギグマーケットプレイス + +## Patlet + +イントラネットのウェブサイトを作成し、特定のインナーソースプロジェクトのニーズを、時間とスキルの要件を明示した「ギグ」としてリストアップすることで、マーケットプレイスを確立する。 +これにより、管理者がインナーソースのコントリビューションを行うための承認を与え可能性が増え、従業員の時間のコミットメントと専門的な利点をよりよく理解することができます。 + +## 問題 + +マネージャーも従業員も、インナーソースプロジェクトに参加することでどのように利益が得られるかを理解していません。 + +従業員がインナーソースプロジェクトに対してどのような時間を費やす必要があるかを経営陣に伝えることは困難です。 + +マネージャーには、インナーソースプロジェクトへの従業員の関与を追跡したり報酬を与えたりするための統一された方法がありません。 + +## ケーススタディ + +あなたは、会社でインナーソースプログラムを成功させ、上級管理職、中間管理職、開発者から賛同を得ています。 しかし、約1年後、最初にそれらを作成したチーム以外の任意のインナーソースプロジェクトに行われた実際のコントリビューションはほとんどありませんでした。 関係者にヒアリングしたところ、インナーソースプロジェクトに参加する場合、開発者がどの程度の時間を割く必要があるのか、また、個人的にどのようなメリットがあるのかが分かりにくいことが主な原因であるようです。また、貢献者のためのどのような機会が存在し、彼らは何をするように求められてもおおよその時間を示すための統一された方法がありません。管理職は協力的で、従業員が参加することを望んでいますが、これまでのところ、インナーソースプロジェクト内の従業員の活動のための会計処理や報酬の方法が欠けています。 すべての関係者(インナーソースプロジェクトの所有者、潜在的な貢献者と開発マネージャー)のためにこの状況を改善するには何ができるのでしょうか? + +## 状況 + +社員は、現在のポジションを離れることなく、会社の他の領域で行われている活動に触れることができればと願っています。しかし、インナーソースのプロジェクトには、社員の参加を阻む2つの要因があります。まず、現在進行中のインナーソースプロジェクトにどのような貢献の機会があるのかを容易に発見し、上司に伝えることができないこと。 つぎに、マネージャーがこれらのインナーソースプロジェクトタスクに対する従業員の時間的コミットメントを計画および説明できないことです。その結果、インナーソースプロジェクトのオーナーは、彼らの目標を達成するために十分な規模のコミュニティを構築することができません。 + +## 組織に働く力学 + +* 社員にはインナーソースのチャンスを見つける簡単な方法が用意されていません。 +* 社員は、貢献が専門的にどのように役立つかを理解していません +* マネージャーは、インナーソースプロジェクトに関連するタスクにかかる時間/労力の要件を理解していません + +## 前提条件 + +* 従業員は、マネージャーからインナーソースプロジェクトに参加する時間を提供されています。 +* マネージャーは、インナーソースのコントリビューションを定量化、追跡、記録して、説明と報酬を得る方法を必要としています。 + +## ソリューション + +個人が自分のスキルや興味のある分野を示すことができ、インナーソースプロジェクトのオーナーがコラボレーションのための機会を宣伝することができます "ギグ" ベースのイントラネットサイトを作成します。 + +従業員は、アプリケーション内に自分のスキルと関心のある分野をリストできるプロファイルを作成できる必要があります。システムは、これらの基準の1つ以上に一致するギグが投稿されたときに、(電子メールまたはその他の手段を介して)個人に積極的に通知することにより、この情報を活用することができる必要があります。 + +インナーソースのプロジェクト・オーナーが投稿する各ギグには、スキルや時間の要件が含まれており、稼働可能な従業員と簡単にマッチングでき、直属の上司に明確に伝えられるようになっていなければなりません。説明は、可能な限り魅力的なようにするために、タスクを引き受ける人にどのように役立つかについての理論的根拠を含める必要があります。 + +従業員のギグへの関与を評価し、追跡するために、ポイントベースのシステムを作成することができます。 例えば、完成したギグを投稿するとギグのオーナーに10ポイント、ギグを完成させた開発者には100ポイントを付与するなどの仕組みを適用します。ギグを完了することで得られるポイントは、ゲーミフィケーションの仕組みとして、また、組織内に存在する専門分野を把握するためのパフォーマンス管理の基準として利用することができます。 + +ギグを受けたい人は、まずギグの所有者が、その従業員がギグを完了するために必要なスキルと割り当てられた時間を有しているかどうかを判断する必要があります。 + +ギグを通じたコントリビューションの透明性は、コントリビューターの評判を高め(あるいは下げ)、コントリビューションの質が高くなる可能性を高めるのに役立ちます。 また、ギグを完成させることで、その分野の専門性を証明することができます。 + +マーケットプレイスに投稿されるギグの内容は、グループイベントの運営、レポートの作成、メンターへの依頼など、ハードスキル、ソフトスキルの両方を含むことができます。 + +ギグマーケットプレイスの構築は、全社的なインフラと機能を提供する責任を持つ組織内のチームによって行われることが理想的です。 + +## 結果の状況 + +インナーソースギグマーケットプレイスは、インナーソースのプロジェクトの数だけでなく、それに関わる社員の数も大幅に増加させます。 ギグマーケットプレイスの自主的な性質は、社員が実行する作業のレベルを選択し、会社全体でパートナーとなることができるようにすることで、社員の仕事の満足度を高めています。 社員は、自分が何にサインアップしているか、そしてその経験から何を期待できるかを正確に理解することができます。 マネージャーは、インナーソースプロジェクトに関する従業員の時間的コミットメントをより適切に推定および追跡し、個々の取り組みを認識し、特定のスキルセットを検証する方法としてギグの成果を使用することができます。 またマネージャーは、社員がギグマーケットプレイスで利用可能な仕事にピボットできるようにすることで、従業員が経験しているかもしれない既存のダウンタイムを活用することができます。 ギグマーケットプレイスでのやり取りによって生成されたデータは、すべての部署で雇用とトレーニングの決定を促進するのにも役立っています。 + +インナーソースポータルのパターンと組み合わせて使用すると、ギグマーケットプレイスは、ギグが関連するプロジェクトのコードリポジトリとドキュメントへのリンクに加えて、より細かいレベルのコンテキストと詳細を提供することができます。 + +## 事例 + +* 大手金融サービスの組織は、インナーソースプログラムを育成するためにインナーソースギグマーケットプレイスのウェブサイトの作成をしました。 +* SAP はギグマーケットプレイスパターンを実装しました - 新しいインナーソースプログラムは、ポジションと同様の提供を掲載することができ、内部のジョブプラットフォームに追加されています。 +* ギグマーケットプレイスパターンは、関連する[インナーソースポータル](./innersource-portal.md)パターンと非常によく機能することが証明されています。 インナーソースポータルは、現在進行中の特定のプロジェクトの認知度を高め、ギグマーケットプレイスは、それらのプロジェクト内で作業可能な特定のタイプのタスクを広告します。 + +## ステータス + +* Structured + +## # 著者 + +* Stephen McCall +* Shreyans Dugar + +## 翻訳の履歴 + +- **2022-06-06** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/innersource-license.md b/translation/ja/patterns/innersource-license.md new file mode 100644 index 000000000..3df3a4d03 --- /dev/null +++ b/translation/ja/patterns/innersource-license.md @@ -0,0 +1,98 @@ +## Title + +インナーソースライセンス + +## Patlet + +同じ組織に属する2つの法人は、ソフトウェアのソースコードを互いに共有したいと考えていますが、法的責任や会社間の会計処理の観点からの影響を懸念しています。 + +**インナーソースライセンス**は、組織内でソースコードを共有するための再利用可能な法的枠組みを提供します。これにより、新しいコラボレーションの選択肢が広がり、関係する法人 の権利と義務が明確になります。 + +## 問題 + +組織内の2つ以上の法人が互いにコードを共有したい場合、条件についての合意が必要であり、多くの場合で法的契約が必要になります。プロジェクトごとにこのような契約を作成するには手間がかかり、それは共有における障壁になってしまいます。たとえば、ある法人のチームは複雑そうだからという理由で、組織内の別の法人とソースコードを共有しないことに決めるかもしれません。 + +共有における障壁は、組織の複数で同様のソリューションを再構築する際のサイロ化と車輪の再発明につながる可能性があります。 + +ソースコードを共有する時点では、共有の価値を確実に予測することはできません。共有の活動に(使用条件の交渉などの)多大な労力が必要な場合、法人は投資に対する収益率を懸念しているため、一連の活動を行う可能性は低くなります。 + +## 状況 + +- コードを共有したい大量の子会社を持つ大組織。組織が大きくなればなるほど、このパターンの価値は高くなります。 +- 定義によると、法人は独自の法的権利と義務を持っています。 +- 複数の法人はソフトウェアを開発しており、他の法人のサービスを使用しています。彼らには、お互いのソースコードに貢献する動機があります。 +- 組織とその組織構造は十分に複雑です。 + +## 組織に働く力学 + +- 特に、技術、法律、ビジネスの観点を考慮する必要がある場合、正式な契約書を書くのに必要な**労力のレベル**があります。 +- 大きな組織(特に多くの法人から成る組織)には、多くの**内部規制**があります。新たに締結される契約は、セキュリティ、プライバシー、調達プロセスなど、これらの規制に準拠しなければなりません。規制が多いため、特に標準的な手順がない場合、2つの法人間でソフトウェアを共有することについてこれらの規制に準拠しているかどうかを評価することが困難になる場合があります。 +- 組織内のいずれかの法人が、独占的なコードと組織内のライセンス料の会計処理に依存する **ビジネスモデル** を有している場合があります。 +- インナーソースのコラボレーションとソースコードの共有に**企業文化**が慣れていない場合があります。これは、共有ソースコードを使用する場合の権利と義務についての不確実性をもたらします。 +- ソフトウェアの使用を自由にすることが、競争と所有権の拡大につながります。 +- ソースコードの共有に関する事項を含む法的なルールが存在します。しかしこれらのルールは標準化されていないため、プロジェクトごとに交渉と理解のための追加的な労力が発生します。また既存の契約では、真のインナーソースのアプローチをサポートするために十分オープンな意味でのソースコードの共有ができない場合があります。 +- あるいは、法的な契約は結ばれていないものの、ソースコードが非公式に共有されている場合もあります。その場合、所有権や権利・義務の明確化が必要なケースにおいて不確実性が生じるかもしれません。 + +## ソリューション + +対象組織(およびその法人)のニーズに合わせてカスタマイズした **インナーソース ライセンス** を作成します。このライセンスは、最も重要な企業間関係に適用できるような汎用的なものである必要があります。 + +インナーソース ライセンスは、関係する法的実体の境界を越えて、本当にオープンソースのような共同作業を可能にするように書くことが重要です。したがって、フリーソフトウェアの4つの自由(*)は、ライセンスに統合されるべきです。 + +このライセンスは正式な法的文書として書かれており、コード共有契約を管理するために法人間の契約の一部として使用することができるようにします。 + +(*「4つの自由」の補足: 使用する自由, 変更する自由, 共有する自由, 変更したソフトウェアを再配布する自由) + +## 結果の状況 + +インナーソースライセンスにより、組織内の法人間でコードを共有するためのツールを手に入れることができます。 + +このライセンスは、ソースコードの共有に関する組織内の会話を簡素化し、法人が最初に使う動機づけにもなっています。 + +**注:** 事例で説明されている実験は初期段階にあります。したがって、しっかりとした**結果の状況**はまだ形成されていません。数ヶ月後には、この問題に対するインナーソースライセンスの効果がより明確になり、このセクションは更新されるでしょう。 + +## 事例 + +DB Systel社は彼ら自身のインナーソースライセンスを作りました、内容は[DB Inner Source License][db-inner-source-license] をご覧ください。彼らは、オープンソースのような出発点を提供する[EUPL][eupl]を使用し、その後、彼らの特定の組織のコンテキストに必要な制約と追加のルールを作り出しました。 + +DB 社の中で最初の法人(企業) は、このインナーソース ライセンスを使用しています。 + +すでに現れているポジティブな効果のひとつは、特に関係者の中にまだインナーソースのコンセプトをよく知らない人がいる場合、会話がシンプルになることです。ライセンスはよく知られた概念なので、インナーソースライセンスがあることは、議論のきっかけになります。 + +この実験では、真のインナーソースのコントリビューションとコラボレーションモデルにつながるために解決しなければならない、さらなるコラボレーションの課題があることも明らかになりました。 + +その課題とは、以下のようなものです。 + +- インナーソースのライセンスプロジェクトを発見できるようにする +- オープンソースのように、プロジェクトでコラボレーションするためのコミュニティを構築すること。 + +これまでのところ、このインナーソースライセンスの下で共有されるソフトウェアは、ほとんどがツール、インフラ、およびスタックの下位にあるツールであることは言及に値します。 + +## ステータス + +* Structured +* **事例**に記載されている実験は、2020年2月から実施されています。最初の経験では、最初のポジティブな効果を示していますが、パターンを完全に評価するためには、より多くの経験が必要になります。 + +## 著者 + +- Cornelius Schumacher (DB Systel GmbH) +- Schlomo Schapiro (DB Systel GmbH) +- Sebastian Spier + +## リファレンス + +- FOSSBack 2020 Presentation: [Cornelius Schumacher - Blending Open Source and Corporate Values](https://youtu.be/hikC6U8X_Ec) - インナーソース ライセンスの詳細については、27:30以降をご覧ください +- [DB Inner Source License][db-inner-source-license] + +## 単語の解説 + +- **組織** - 複数の企業の母体(同義語: グループ、ホールディング、エンタープライズ) (例: Microsoft Corporation) +- **法的エンティティ** - 独自の法的権利と義務を有するエンティティ (同義語: グループ子会社、子会社、関連会社) (例: Microsoft Japan, GitHub, LinkedIn) + +[db-inner-source-license]: https://github.com/dbsystel/open-source-policies/blob/master/DB-Inner-Source-License.md +[eupl]: https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12 + +## 翻訳の履歴 + +- **2022-06-05** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/innersource-portal.md b/translation/ja/patterns/innersource-portal.md new file mode 100644 index 000000000..3d64de4af --- /dev/null +++ b/translation/ja/patterns/innersource-portal.md @@ -0,0 +1,104 @@ +## Title + +インナーソースポータル + +## Patlet + +潜在的なコントリビューターは、彼らが興味を持っているインナーソースプロジェクトを簡単に見つけることができません。すべての利用可能なインナーソースプロジェクトの情報をインデックス化するイントラネットのウェブサイトを作成することにより、あなたはコントリビューターが彼らに興味があるかもしれないプロジェクトについて知ることができ、インナーソースプロジェクトのオーナーは、外部のオーディエンスを引き付けることができます。 + +## 問題 + +インナーソースプロジェクトチームは、外部からのコントリビューションを集めることが難しいと感じています。 + +あなたの組織のインナーソースプロジェクトは増えているものの、潜在的なコントリビューターにとって、それらのプロジェクトを見つけるための簡単な方法がありません。 + +## ケーススタディ + +あなたは、組織内のインナーソースプラクティスを確立しようとしています。 あなたは、いくつかのプロジェクトがインナーソースモデルを使用して運用されていることを知っていますが、それらの存在は、他の社員の口コミ、電子メールまたは立ち話を介してのみ伝達されています。 結果としてインナーソースプロジェクトのオーナーは、コントリビューターを引き付けることに困難を感じています。 + +現在、組織全体の従業員がアクセスできる単一の共有リソースはなく、進行中のすべてのインナーソースプロジェクトを簡単に見つけることはできません。このことは、すべてのインナーソースプロジェクトの成長の可能性を大幅に制限しています。 + +すべてのインナーソースプロジェクトが、できるだけ多くのオーディエンスにビジビリティを発揮し、組織全体のコントリビューターを引き付けるためには何ができるでしょうか? + +## 状況 + +* あなたの組織は、インナーソースワークスタイルを採用することに興味を持っています。 +* インナーソースプロジェクトのオーナーは、彼らのプロジェクトにオーディエンスを引き付けるための方法を探しています。しかし、潜在的なコントリビューターに宣伝するために利用できる通信チャネルはなく、活動が制限されてしまっています。 +* あなたの組織でインナーソースプロジェクト自体は増加しています。 +* この問題をさらに深刻にしているのは、使用されている共有ソース管理アプリケーションの検索機能が非常に限られているためです。インナーソースプロジェクトを探すのに慣れた開発者でさえ、その場所を特定するのに苦労しているという事実です。 + +## 前提条件 + +* マネージャーは、従業員がインナーソースプロジェクトに参加することを暗黙の了解としています。 +* ホストするリポジトリのコンテンツは共有ソース管理システムによって提供されていますが、プログラムによるアクセス制限がついています。 +* 組織内にインナーソースコラボレーションの促進を担当する部門があります。 + +## 組織に働く力学 + +* 別々のエンジニアリングチームが、共通の課題に対してパートナーとして取り組むことのポテンシャルが十分に発揮されていません。 +* インナーソースプロジェクトが存在することを、個人が知ることは困難になっています。 +* インナーソースプロジェクトのオーナーが外部のコントリビューターを引き付けることは困難です。 + +## ソリューション + +インナーソースプロジェクトのオーナーがプロジェクトの利用可能性を簡単に宣伝できるインナーソースポータルイントラウェブサイトを作成します。 + +ポータルの主要な内容は次のとおりです。 + +* インナーソースポータルにアクセスした人は、すべての利用可能なプロジェクトを見るだけでなく、プロジェクト名、使用中の技術、コントリビューター名、スポンサー事業部などの様々な条件に基づいて、特定のプロジェクトを検索することができるようになっています。 +* インナーソースポータルを通じて表示される情報は、常にインナーソースプロジェクトのオーナーの完全な制御下にある必要があります。プロジェクトリポジトリ自体に格納されている特定のデータファイルまたはメタデータから直接この情報をソーシングすることによって実現されるのが好ましいです。 +* プロジェクトのオーナーは、プロジェクト名、トラステッドコミッターの名前、簡単な説明とコードリポジトリまたは任意のサポートドキュメントへのリンクを含むそれらのデータファイル内のプロジェクトに関するすべての関連情報を含める必要があります。 +* (*オプション)ほとんどの組織は、ポータルをイントラネットでのみ利用できるようにすることを選択しますが、いくつかの組織は、ポータルを公共のインターネット上で利用できるようにすることを選択しました。後者は、例えばブランディングや採用の目的で、ポータルにインナーソースのアプローチに関する追加情報を表示したい組織にとって興味深いものになるでしょう。 + +ポータルを立ち上げる際には、ポータル内に表示されるプロジェクトの数を増やすために、インナーソースのデータファイルやコードリポジトリへのメタデータの追加を促進するコミュニケーションキャンペーンを検討する必要があります。 + +インナーソースポータルの[参考実装](https://github.com/SAP/project-portal-for-innersource)はGitHub上で公開されており、コントリビューションを受け付けています。これは、インタラクティブで使いやすい方法で、組織のすべてのインナーソースプロジェクトを一覧表示します。プロジェクトはGitHubの専用トピックを使って自己登録し、追加のメタデータを提供することができます。 + +![Example of an InnerSource Portal](../../../assets/img/portal-overview.png "Example of an InnerSource Portal") + +## 結果の状況 + +* インナーソースポータルは、インナーソースプロジェクトのオーナーが組織全体のオーディエンスにプロジェクトを広告することが可能になりました。ビジビリティがあがったため、彼らはこれまで以上に大きなコントリビューターのコミュニティを惹きつけています。 +* インナーソースプロジェクトに参加したい人のために、インナーソースポータルは、社員が特定の条件に基づいてすべての利用可能なインナーソースプロジェクトを横断検索することによって、興味を持っている種類を正確に発見することを可能にしました。 +* インナーソースプロジェクトへの参加を検討している場合、インナーソースポータルでは、特定の基準に基づいて利用可能なすべてのインナーソースプロジェクトを一度で検索することにより、関心のある機会の対象を正確に見つけることができます。 +* これらの両方のニーズを満たすことで、組織のすべての領域において個別に実現できないことを一緒に達成するために活用できる魅力的な手段として、インナーソースを確立するのに役立ちました。 + +## 事例 + +* **大手金融サービス組織**は、異なるビジネスユニット間で存在するインナーソースプロジェクトを宣伝し、発見する仕組みを提供するためにインナーソースポータルを使用しています。 +* **SAP**はインナーソースポータルでインナーソースプロジェクトを推進しています。 プロジェクトはGitHubトピックを使用して自己登録することができます。[リポジトリアクティビティスコア](repository-activity-score.md) は、ポータル内のインナーソースプロジェクトのデフォルトの順序を定義しています。 また、SAP における事例はこちらもご参照ください[Michael Graf & Harish B (SAP) at ISC.S11 - The Unexpected Path of Applying InnerSource Patterns](https://www.youtube.com/watch?v=6r9QOw9dcQo&list=PLCH-i0B0otNQZQt_QzGR9Il_kE4C6cQRy&index=6)。 コードベースは[リファレンス実装](https://github.com/SAP/project-portal-for-innersource) として公開されており、コントリビューションのためにオープンになっています。 +* **Elbit Systems**はこのパターンを使い、さらにゲーミフィケーションを上乗せしています。 + * [文化変革の手段としてのゲーミフィケーションとインナーソースのエンゲージメントブースター](https://www.oreilly.com/library/view/oscon-2018-/9781492026075/video321579.html) | Shelly Nizri | OSCON 2018 - Portland, Oregon + * Of Islands, Monsters & InnerSource [(slides)](https://docs.google.com/presentation/d/1P1OCEK9B6eSrVRUclVWY6meSI-qHOBjM_UAPNvCZamU/edit#slide=id.p15), [(video)](https://drive.google.com/file/d/1pM89uHMn0vhE3ayFJDGYcCO8R0tAXXZD/view?usp=drivesdk) | InnerSource Spring Summit 2019 (Galway, Ireland) + + このプラットフォームを実現するコードはオープンソース化されており、[gitlab.com/gilda2](https://gitlab.com/gilda2)にて公開されています。 + +* **アメリカン航空**は、[インターナルインナーソースマーケットプレイス](https://tech.aa.com/2020-10-30-innersource/)を介してInnerSourceプロジェクトを推進しています。SAPと同様に、プロジェクトはGitHubのトピックとして `innersource` を追加することで自己登録されます。プロジェクトは、言語、トピック、オープンイシューの数などで検索やフィルタリングが可能です。 + +* **Banco Santander**社は、インナーソースをサポートして増やすために、[Santander ONE Europe InnerSource Community](https://innersourceportal.santander.com/)という公開ポータルを作成しました。このポータルには、プロジェクトのカタログに加え、ドキュメント、仕事の進め方、ニュース、イベントなどの関連コンテンツが含まれています。 + +![Santander InnerSource Portal](../../../assets/img/santander_portal.png "Banco Santander InnerSource Portal") + +## リファレンス + +* インナーソースポータルパターンは[インナーソースギグマーケットプレイス](./gig-marketplace.md) のパターンと一緒に使うと非常によく機能することが証明されています。 + +## ステータス + +* Structured + +## 著者 + +* Stephen McCall + +## 謝辞 + +* Shelly Nizri +* Melinda Malmgren +* Michael Graf +* Jesús Alonso Gutierrez + +## 翻訳の履歴 + +- **2022-06-06** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/issue-tracker.md b/translation/ja/patterns/issue-tracker.md new file mode 100644 index 000000000..27dcab71a --- /dev/null +++ b/translation/ja/patterns/issue-tracker.md @@ -0,0 +1,57 @@ +## Title + +イシュートラッカーの使い方を多様化する + +## Patlet + +インナーソースのホストチームは、計画や進捗だけでなく、変更の背景も透明化することができていません。これは、プロジェクトのイシュートラッカーのユースケースを増やし、ブレーンストーミング、実装の議論、機能設計にも使えるようにすることで解決することができます。 + +## 問題 + +あるチームが、組織内の多くのチームが依存するコンポーネントを開発しています。このチームは、未解決のバグや機能要求を追跡するために、標準的なイシュートラッキングシステムを使用しています。しかし、各エントリのコンテキストは非常に限られています。その結果、潜在的なコントリビューターは、各課題がどのような変更について話しているのかを知る術がありません。 + +## 状況 + +インナーソースのプロジェクトツールはすべてセットアップされています。しかし、プロジェクトのイシュートラッキングシステムは、主に進捗の共有のために使用されます。インナーソースプロジェクトでは、リモートでの非同期通信を容易にするために、イシュートラッカーが使用できるユースケースは他にもたくさんあります。 + +## 組織に働く力学 + +* コントリビューターは、自分たちが必要としている機能がすでにロードマップにあるかどうかを理解したいと思っています。しかし、イシューには多くの文脈が欠落しており、既存のイシューがコントリビューターのニーズに合致しているかどうかを判断することは不可能です。 +* その結果、多くの重複したイシューがオープンされ、ホストチームがそれに対処しなければならなくなります。 +* オープンなイシューの文脈は非常に限られているため、コントリビューターはすでにオープンになっている簡単なイシューを実装して、ホストチームを助けることができません。その結果、多くの作業がホストチームの手に委ねられることになります。 +* 口頭でのコミュニケーションに重点を置いているため、数ヶ月後や数年後に、なぜとある機能が実装に選ばれたのかを見極めることができません。その結果、リファクタリング、特にコンポーネントの簡略化は、プロジェクト考古学そのものとなり、議論されたことを覚えている人たちの脳を巻き戻して考えるしかなくなります。 + +## ソリューション + +純粋なソフトウェア開発だけでなく、新機能の企画段階でも「言葉より文字」の哲学を受け入れましょう。 + +* バグ、計画された機能、機能のアイデアについては、それぞれ別のイシューを作成します。それぞれのイシューには、外部の潜在的なコントリビューターが文脈を理解できるように、可能な限り多くの情報を含めるようにします。理想的には、特に簡単な変更については、外部のコントリビューターが問題の機能を実装することでホストチームをサポートできるよう、十分な情報を含めることです。 +* 質問するためのチャネルとして、イシュートラッキングシステムを利用することができます。これは、ユーザーの質問に対応するための他のコミュニケーション源が不足している場合に、特に有用です。 +* 異なる目的で使用されるイシューを区別するために、タグやカテゴリーを使用します。 +* 非同期でブレーンストーミングを始めるには、アイデアを集めるためにイシューを開きます。議論が落ち着いてきたら、このイシューで指摘されたことを別の文書にまとめます。それをプルリクエストとして投稿し、まだ説明が必要な個々のポイントについて掘り下げます。出来上がった文書は、他の適切なチャンネルで結果を公表したり、将来の参考資料として使用したりすることができます。 +* ほとんどのイシュートラッキングシステムで、イシューのテンプレートを作成することができます。バグレポートに必要な情報を集めるだけでなく、他の用途でどのような情報が必要なのかのヒントも含めて活用しましょう。 + +## 結果の状況 + +* プロジェクトのイシュートラッキングシステムをコミュニケーションに活用することで、外部のコントリビューターがプロジェクトの動向を把握し、何をコントリビュートすべきかをより的確に判断することができるようになります。 +* 文書によるコミュニケーションに重点を置くことで、ホストチームのメンバーがリモートで参加できるようになった。 +* 常に文書でコミュニケーションすることで、プロジェクトの決定事項に関する受動的な文書が副産物として蓄積され、特別な注意を必要としなくてすみます。 +* 公開コミュニケーションチャネルを一貫して使用することで、より多くの人間が議論に参加することになります。つまり、質問に答えたり、未解決の問題を指摘したり、計画中の機能の欠点を指摘したりできる、より多くの知識を持った人間を巻き込むことができるようになります。 +* ディスカッションを公開の場に移すことで、将来のコントリビューターとなる可能性のあるメンバーがが、プロジェクトに参加する必要が生じるずっと前に、プロジェクトに潜り込み、フォローし、慣れ親しみ、プロジェクトのやり方を学ぶ機会を作ることができます。 + +## 事例 + +* Europace AG - ブログをご覧ください [Issue Use Cases](https://tech.europace.de/post/using-issues-for-asking-questions-and-tracking-work/) + +## 著者 + +Isabel Drost-Fromm + +## ステータス + +Structured + +## 翻訳の履歴 + +- **2022-06-06** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/maturity-model.md b/translation/ja/patterns/maturity-model.md new file mode 100644 index 000000000..7a3d4aa12 --- /dev/null +++ b/translation/ja/patterns/maturity-model.md @@ -0,0 +1,221 @@ +## Title + +成熟度モデル + +## Patlet + +チームはインナーソースを採用し始めました。このプラクティスは、複数の部門に広がっています。しかし、インナーソースプロジェクトを構成する概念への理解は様々です。解決策は、チームがセルフチェックを経て、まだ気づいていないパターンやプラクティスを発見できるよう、成熟度モデルを提供することです。 + +## 問題 + +企業におけるインナーソースの導入が進み始めると、一人のエバンジェリストを通じて各プロジェクトを個別に指導することは不可能になります。また、インナーソースプロジェクトで働くことの意味について、少なくとも基本的な理解を深めている人が増えてきています。すべてのインナーソースプロジェクトを見てみると、コンセプトに対する理解の深さは異なります。チームは、彼らが次のレベルに移動し、彼らが扱っている問題やペインのポイントを解決するのに役立つだろう実績のあるパターンを認識していない可能性があります。 + +## 状況 + +いくつかのチームがインナーソースのプラクティスを採用し始めています。プラクティスの正確な理解度は、チームによって異なります。また、各チームが直面する問題も、各チームの状況や作業環境に応じて異なります。その結果、インナーソースプロジェクトにおける重要なベストプラクティスの定義は、各チームによって異なっています。 + +## 組織に働く力学 + +インナーソースのラーニングを共有するチームは、インナーソース採用の各レベルを認識していません。そのため誤解につながることがあります。 + +チームは、「ソフトウェアの[共有プラットフォーム(フォージ)](https://en.wikipedia.org/wiki/Forge_%28software%29)への移行がすべてだ」と考えています(GitLab、GitHub、Bitbucketがそのようなフォージのよく知られた例です)。 + +チームは、日々の業務で遭遇する問題を解決するためのベストプラクティスを知りません。 + +## ソリューション + +提案された成熟度モデルに照らして、チームに自己評価をしてもらいましょう。 + +### 透明性 + +**プランとプロダクト (PP)** + +インナーソースプロジェクトは、ステークホルダーが決定をよりよく理解し、他の人が従うことができる方法で決定に影響を与えることができるようにすることで、組織全体で透明性のある計画を立てることができ、そのことから恩恵を受けます。 + +* PP-0: 個人やチームが、複数のステークホルダーに対して定期的にプランやプロダクトを開示していません。組織内に正式なアクションが存在しません。 +* PP-1: 個人やチームは、プランやプロダクトが開始される前に、複数のステークホルダーにたいして可視化します。またロードマップは共有されています。 +* PP-2: 明確なガイドラインと貢献ルールを持つ共有ロードマップが既に存在し、ステークホルダーがフィードバックを提供できます。しかし、これは組織全体で標準化されておらず、すべてのプロジェクトがこの情報を提供しているわけではありません。 +* PP-3: ロードマップはデフォルトで共有され、各インナーソースプロジェクトのレベルで、組織全体でこれを行うための標準的なプロセスとスタンダードな方法があります。これには、ロードマップにコントリビュートして影響を与えるための明確なルールが含まれています。 + +**開発プロセスとツール (DP)** + +インナーソースプロジェクトは、コントリビューターがアクティブになって参加するときに成長します。 結果として、コントリビューションを容易にすることは、純粋な技術的目標とバランスを取る必要があります。 + +* DP-0:各チームが独自の開発プロセスやツールに従っています。 しかしそれらは、開発チームの外部で知識や成果物を共有するように設定されていません。開発チームはサイロ化されています。 +* DP-1: 開発チームは、内部で共有リポジトリを使用します。しかし一部のチームは、企業標準ではないCIツールを使用して、独自のCIプロセスを開発しています。コードレビューのプロセスは定義されていませんが、プロジェクトチーム内部で行っているところもあります。 +* DP-2: 組織は、集合知のための共有リポジトリを後援し、推進しています。チームによっては、企業の定めたCIツールを使って、独自のCIプロセスを開発しています。CIの環境があるり、またコードレビュープロセスが定義されており、いくつかのプロジェクトで使用されています。コードレビューが外部のチームメンバによって行われることもあります。 +* DP-3: ほとんどのチームが、企業が定めたCIツールを使って独自のCIプロセスを開発しています。CI環境はあり、コードレビュープロセスが定義され利用されています。コードレビューがチーム内外のメンバーによって行われています。 + +**意思決定(DC)** + +同僚にコアチーム以外の仕事へのコントリビューション意欲を持たせるためには、ホストプロジェクトの意思決定プロセスを可視化し、さらに自分たちの声が聞き入れられ評価されていると感じてもらうことが重要です。 + +* DC-0: 意思決定者はしばしば、プロジェクトの決定に関連するデータや資料を意図的または偶発的に非公開にすることがあります。 +* DC-1: 意思決定プロセスの一部である資料は、意思決定が確定した後に閲覧できるようになります。 +* DC-2: メンバーは、重要な意思決定のほとんど(すべてではない)について知っており、その意思決定の形成に役立っていると感じています。 意思決定の実践の一部となる資料が、プロジェクトの節目節目で利用できるようになっています。 +* DC-3: メンバーは、組織が承認する集合的な意思決定のための共有された標準プロセスの一部であると感じています。意思決定プロセスの一部である資料は、プロセス中に継続的にアクセス可能になっています。 + +**役立つリソース** +コントリビューターを引きつけるために、役立つサポート資料に簡単にアクセスできる必要があります。 + +* RS-0: 個人およびチームは、ナレッジに関する共有リポジトリにコントリビュートしたり、それを利用したりすることはありません。 +* RS-1: 個人およびチームは、作業が終了した後、内部でレビューするためにプロジェクト資料をリリースします。個人とチームはリソースを共有しますが、それは切断された、断片化された、または個別化/サイロ化されたシステムまたはリポジトリにあります。 個人とチームはリソースを共有しますが、情報が機密であるかどうかを判断するために使用される基準について、一般的に表現され共有されているものはありません。「他人と考えを共有する」こともしていません。 +* RS-2: 個人およびチームは、明確に定義および共有された形式および/またはプロトコルに従って、プロジェクトチームの一部のメンバーがプロジェクト関連の資料にアクセスできるようにします。個人およびチームは、機密データおよびリソースを差し控え、限定された詳細、コンテキスト、および範囲を提供します。 +* RS-3: 個人およびチームは、明確に定義および共有された形式および/またはプロトコルに従って、プロジェクト関連の資料を組織に広くアクセスできるようにします。機密データやリソースを差し控えなければならない個人やチームは、共有しないものについて明確に知っており、他の人はそれらの資料が利用できない理由を理解しています。 + +**ストーリー** +ホストチームの中で働くと、ミスが自動的に目立ってしまうようになります。そのため、失敗を成長の機会としてとらえる企業文化が必要です。 + +* ST-0: 学習の目的でも、成功や失敗を他者が学ぶために共有しません。 +* ST-1: 成功体験は共有しやすい一方で、失敗体験は共有していません。 +* ST-2: 個人とチームは、レトロスペクティブやレビューの際に、成功や失敗のストーリーを共有することに抵抗はありません。 +* ST-3: 個人とチームは、成功や失敗のストーリーを共有することに抵抗がなく、正式なプロトコルに従って失敗から学ぶことができます。 + +### コラボレーション + +**フィードバックのためのチャネル** + +サイロをなくすには、同僚がオープンにフィードバックを共有することに対する抵抗をなくす必要があります。それをサポートする簡単な方法のひとつは、階層を越えて同じコミュニケーション原則を使用することです。 + +理想的には、組織の誰もが知っている適切なコミュニケーション・チャネルを持つことになります。チャネルは、異なるターゲット(お知らせ、ユーザーサポート、開発チャネル、インフラ・ディスカッションなど)に焦点を当てます。 +インナーソースプロジェクトが成熟するにつれて確立するベストプラクティスには以下のようなものがあります。 + +* ネチケットガイドラインの採用 +* 新しいインナーソースプロジェクトごとに実証済みの(アーカイブされ、一般にアクセス可能で、検索可能な)標準チャネルの開設 + +* CF-0: プロセスも確立されたチャネルもありません。組織の一部のメンバーは、プライベートチャネルまたはディスカッションを介して資料を共有しています。 +* CF-1: 組織は、組織に属する誰もがそれらを使用できるように、会社/部門の決定に関する多様な視点を奨励するための内部ガイドラインとチャネルを確立する過程にあります。 一方で組織の一部のメンバーは、非公式のプラットフォームを使用して非公式に意思決定資料を共有しています。リーダーは、組織のメンバーが自分の仕事に関連するいくつかの問題について建設的に意見を共有するための、少なくともひとつの明確で直接的なチャネルを維持しています。 +* CF-2: 組織は内部ガイドラインとチャネルを確立し、チームまたは決定に関する多様な視点を奨励および要請するための特定のリソース(トレーニングプログラム、コンテンツへのアクセスなど)を提供しています。 +* CF-3: 組織のメンバーは、公式に認可されたプラットフォームで意思決定資料を共有します。組織のメンバーは、フィードバックのための複数のチャネルと方法を介して資料をオープンに共有します。リーダーはそれらのチャネルを自分で使用し、他の人にそれらを使用するように公に奨励し、受け取ったフィードバックやこのフィードバックに対処するために取った行動のチーム向けまたは公開向けの記録を維持します。 + +**リーダーシップ** + +インナーソースプロジェクトは、従業員が直属のラインマネージャーの直接の影響を受けないプロジェクトにコントリビュートすることを奨励しています。これには信頼の文化が必要です。 + +* LS-0: 高度に階層化された組織内の命令系統とコントロールのカルチャーがあります。 +* LS-1: 一部のリーダーは、フィードバックを受け取り、メンバーが安全にフィードバックを提供できる環境を構築することに積極的です。 +* LS-2: 組織のほとんどのリーダーは、フィードバックを受け取り、メンバーが安全にフィードバックを提供できる環境を作ることに積極的です。しかしリーダーは、すべてのメンバーが権限を与えられ、共有できるようになったかどうかを理解することに消極的です。組織は、リーダーが対話のなかに存在しない声を積極的に求めて含めることを奨励しています。 +* LS-3: メンバーは、自分の仕事に関連する問題や情熱を持っている問題について建設的に意見を共有できるようになり、力を与えられたと感じています。 + +**組織的、そして機能的な構造** + +インナーソースが純粋なコーディングレベルを離れ、コミュニティやワーキンググループレベルに入ると、直接的なコードコラボレーションが不可能な場合でも、サイロを減らす可能性があります。 + +* OF-0: ワーキンググループでは、メンバーやスキルセットが固定される傾向にあります、 +* OF-1: 機能横断的なチームは存在するものの、チームの役割が不明確で、ガバナンス体制が曖昧であることが多いです。 +* OF-2: 機能横断的なチームが一般的であり、チームはその役割と目標を公表しています。 +* OF-3: 機能横断的なチームは一般的であり、その活動は組織内に広く知られ、その結果、組織は協業のためのベストプラクティスを推進しています。 + +**コントリビューション** + +コントリビューションパターンを設計する際の目標が、サイロを減らすことである場合、コラボレーションを念頭に置く必要があります。 + +* CB-0: 完全にサイロ化されており、チーム外でのコラボレーションはありません。コラボレーションはクロスファンクショナルチームによるものがいくつかあります。 +* CB-1: 組織のメンバーとチームは協力していますが、「難しすぎる」とよく言われます。 チームは、コラボレーションの結果をめったに再評価しません。 +* CB-2: 組織のメンバーとチームは、積極的に協力する機会を求めています。チームは、共同作業の結果について定期的に話し合い、再評価し、議論し、これらの結果をデフォルトで利用できるようにします。 +* CB-3: 組織のメンバーは、関係者全員に利益をもたらす方法で、内部と外部の両方で協力します。 チームは共同作業の結果について定期的に話し合い、再評価し、議論し、組織外で学んだことを共有し、これらの結果をデフォルトで外部で利用できるようにします。 + +### コミュニティ + +**共有ポリシー** + +共有値に関するベースラインがあると、チームの境界を越えて作業しやすくなります。限られたベースラインルールとガイドラインのセットがどこにでも適用され、簡単に参照できる場合は、境界を越えることが容易になります。 + +* SP-0: 共有する文化もドキュメント化されたポリシーもありません。 +* SP-1: 組織の一部のメンバーは、価値観や原則を定義するために団結するものの、その際に明確に支持されることはありません。 +* SP-2: 組織のメンバーは、ミッションステートメントや行動規範などの共有ビジョンと合意をまとめてドキュメント化し、簡単にアクセスできるようにし、頻繁に参照します。 オンボーディング資料とオリエンテーションの慣例は、新しいメンバーが組織がコントリビューションからどのように利益を得るかを理解するのに役立ちます。 +* SP-3: 共有された価値観と原則は、組織のメンバー間で意思決定、コンフリクトの解決、および評価プロセスに情報を提供します。メンバーは、これらの価値観と原則を口頭とドキュメントの両方の形式で一貫して参照します。 + +**組織の一員であると実感できる** + +インナーソースを組織に導入する理由のひとつとして、エンゲージメントの向上が考えられます。このポイントでは、インナーソースを採用している間にエンゲージメントがどのように変化しているかを追跡します。 + +* PA-0: エンゲージメントが低く、コラボレーションがなく、人々は他の人と共有することに抵抗を感じます。 +* PA-1: 組織のメンバーは、報復を恐れることなく自分の考えや意見を共有することに抵抗を感じませんが、それはあくまでも慣れ親しんだ領域でのみです。ただしメンバーは、最高のアイデアが勝ち、コントリビューションとコミットメントの実績を持つ人々にリーダーシップの責任が生じることを理解しています。 +* PA-2: 組織のメンバーは、報復を恐れることなく、自分の考えや意見を快適に共有できます。リーダーは、組織の共有価値への献身を示します。 +* PA-3: 組織はメンバーにコントリビューションの恩恵を受けていることを積極的に伝えています。このように、メンバーは共有された意識と権限を与えられた実行を示し、コミュニティへの責任感を感じます。リーダーは、他の人の成長を支援することで成長することを理解し、組織のジュニアメンバーを指導します。 + +### ガバナンス + +**リワード** + +チーム横断的なコラボレーションを促進するために、外発的モチベーションを利用することができます。 + +* RW-0: 報酬が設定されていません。 +* RW-1: リーダーは例外的なコラボレーションに対して報酬を与えるよう奨励されていますが、方針やプロセスは確立されていません。 +* RW-2: 開発者チーム以外のコラボレーションに報酬を与えるための標準的なプロセスが確立されています。チームリーダーや役員会が報酬を決定しています。 +* RW-3: 報奨は組織から提案されるだけでなく、コミュニティがより価値のある報奨を定義することができます。コミュニティが責任を持って報酬を決定しています。 + +**モニタリングポリシー** + +インナーソースのプロジェクトは、自己を評価のための手段を必要とします。メトリクスは、この評価を容易にするための一つです。またインナーソースの導入レベルが成熟している組織では、明確で合意された測定基準に基づいて、この手法の導入が追跡されることが期待されています。 + +* MP-0: 組織内のどのレベルにおいても、既存の監視ポリシーがありません。 +* MP-1: メトリクスは特定のチームにとって重要であり、独立した方法でそれらは使用が始まっています。 +* MP-2: 組織全体で特定の方針を検証するのに役立つ測定基準に関して、組織レベルでの戦略があります。このモニタリング方針は、いくつかのインナーソースプロジェクトのレベルでも存在します。 +* MP-3:組織が提供する特定のインフラストラクチャでのメトリックの使用に関する明確なガイドライン、推奨事項、およびトレーニングがあります。これは組織内での一般的なインナーソース採用を理解するためのインナーソースプログラムと、インナーソースプロジェクトの2つのレベルで機能します。 + +**サポートとメンテナンス** + +インナーソースチームは機能開発のみを担当するのではなく、サポートとメンテナンスもチームのコアタスクの一部です。 + +* SM-0: コア開発者またはサポートチームによるサポートが存在します。ビジネスサイドはサポートを保証します。チーム外には製品についての知識がありません。 +* SM-1: 専任のサポートチームによってサポートが提供されます。製品のサポートを形式化するための規則と規制があります。 +* SM-2: インナーソースコントリビューションのサポートは、[30日の保証期間](./30-day-warranty.md)や[ライブラリよりもサービス](./service-vs-library.md)などのインナーソースパターンによって形式化されています。 +* SM-3: 成熟したコミュニティによって提供される、製品のサポートを形式化するための規則と規制があります。 + +**カルチャー** + +協調的な文化に対する複数のレベルがあります。 + +* CL-0: サイロ - チームは独立して機能しますが、単独でも機能します。 +* CL-1: リアクティブ - チームは独立して動きますが、うまくいかない依存関係に対応する方法を知っています。 +* CL-2: コントリビューション - チームはコントリビュートすることで依存関係の改善を積極的に支援します。 +* CL-3: アクティビスト - チームは積極的に助けを求め、メンタリングをし、新しいコントリビューターを募集します。 + +**インナーソースにおける役割** + +インナーソースにはいくつかの明示的な役割があります。初期の段階では、これらの役割を採用しなくても一部のパターンを使用できる場合がありますが、明示的な役割のタイトルを使用してプロジェクト内でコミュニケーションする方が簡単になります。 + +* RO-0: インナーソースの採用を支援する特定の役割はありません。開発者、アナリスト、テスターなど一般的な開発の役割のみが存在します。 +* RO-1: 時折、一部の個人やチームが他のプロジェクトにコントリビュートします。これらは技術的なコントリビューションであり、ユーザー/コントリビューターの役割が見られます。 チームによっては、少なくとも一人のメンバーが、他の開発チームのメンバーに開発プロセスを説明する技術的なリファレンスであることが確認されています。このメンバーはトラステッドコミッターの役割をカバーするための候補者となりえます。 +* RO-2: 「インナーソースオフィス」が存在します。このオフィサーの役割は、プロセスなどを含むガバナンスとサポートを担当します。教育のニーズを特定し、これが組織に確実に提供されるようにします。 またインナーソースプロジェクトへの取り組みにおいて組織を主導および指導します。 これはインナーソースのビジョンとロードマップを定義する、最初の正式なステップです。そしてトラステッドコミッターの役割は開発チームのメンバーだけでなく、外部のコントリビューターにとっての連絡先/参照先にもなっています。コミュニティにコントリビュートする方法を説明する標準的なプロセスがあり、コントリビューターの役割が存在します。またもう一つの役割として「データサイエンティスト」が存在します。この役割はインナーソースの成長を測定するために必要な、インナーソースアクティビティの履歴管理を担当します。トラステッドコミッター の役割がより技術的な役割に進化していくと、「コミュニティマネージャー」の役割が生まれてきます。コミュニティマネージャーはコミュニティの活性化を担当し、新しい開発者/ユーザー(コントリビューター/コミュニティメンバー)を引き付けて維持する主な責任を負います。 +* RO-3: 「エバンジェリスト」は組織内を移動し、現在の作業、インナーソースの機能とその方法を他の人に知らせ、他の人がイニシアチブを理解して参加できるように支援します。この段階では「非技術的なコントリビューター」の存在も出現します。 + +## 結果の状況 + +すべてのチームが、利用可能なベストプラクティスを認識しています。 + +チームは、インナーソースの採用のレベルを理解しています。 + +作業モデルとしてインナーソースを採用する前に、チームは短期的にも長期的にも、チームに期待されるプラクティスを認識しています。 + +## 事例 + +* Entelgy +* Zylk +* Bitergia + +## 著者 + +* Daniel Izquierdo Cortazar +* Isabel Drost-Fromm +* Jorge +* Nerea + +## 謝辞 + +* Alexander Andrade (スペルの修正に特に感謝します) + +## その他の呼び方 + +成熟度モデル: インナーソースのベストプラクティスについて学ぶ + +## ステータス + +* Structured +* Drafted in September 2019 + +## 翻訳の履歴 + +- **2022-06-03** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) diff --git a/translation/ja/patterns/praise-participants.md b/translation/ja/patterns/praise-participants.md new file mode 100644 index 000000000..a7cdc33ee --- /dev/null +++ b/translation/ja/patterns/praise-participants.md @@ -0,0 +1,88 @@ +## Title + +コントリビューションの功労を称える + +## Patlet + +インナーソースのコントリビューションの後、その時間と努力に対してコントリビューターに感謝することは重要です。 +このパターンは、コントリビューションを効果的に認めるだけでなく、コントリビューターや他の人たちのさらなる関与を引き出すためのガイダンスを提供します。 + +## 問題 + +プロジェクトにコントリビュートしてくれたインナーソースのコントリビューターに対して、どのように感謝の気持ちを表せばいいのでしょうか? +感謝の気持ちを伝えることを忘れてしまったり、十分な効果や誠意を示すための言葉や場所がわからなくなってしまったりすることがあります。 +賞賛と感謝は、楽しさやコントリビューターとそのマネージャーのモチベーションを維持し、継続するための簡単で使いやすい方法です。 +このパターンがあれば、簡単に実行でき、メッセージが明確かつ誠実に伝えることができるようになります。 + +## 状況 + +* あなたはインナーソースプロジェクトの [トラステッドコミッター](./trusted-committer.md) あるいはメンテナーです。 +* あなたは、コントリビューターのコミュニティを大切にし、それを維持・発展させたいと考えています。 + +## 組織に働く力学 + +* あなたは忙しいので、賞賛や感謝のようなソフトタッチを忘れがちです。 +* あなたは、人付き合いが苦手だったり、口下手だったりするかもしれません。 +* 仕事への満足度やキャリア開発には、仲間からの評価が非常に重要です。 + +## ソリューション + +他人から認められることは、誰にとっても気持ちの良いことです。 +プロフェッショナルな場では、認知度の向上は、影響力や成長への道筋にもなります。 +誰かがあなたのインナーソースプロジェクトにコントリビュートしたときはいつでも、誠実で適格な「ありがとう」の言葉でその人を認めてあげてください。 + +自明でないコントリビューション(すべてのコードコントリビューションと多大な時間的コントリビューション)に対しては、以下の方法でお礼を言いましょう。 + +(1) あなたがプロジェクト活動を組織しているチャットの場所 (例: _Slack_) で、その人の名前を呼びます。 その人が何をしたかを皆に知らせ、公に感謝します。 + +例 (意訳): + +> みなさん、@andrew.clegg が _rcs-viewer_ を _hebo-client_ の最新版 (https://github.com/rcs/rcs-viewer/pull/81) にアップデートしてくれました! Andyさん、ライブラリを最新に保つ活動をお手伝いしていただきましてありがとうございます!! + +(2) 彼らとそのマネージャー(cc'd)に、個人的にお礼のメールを送ります。 +コードのコントリビューションでは、しばしばマージ通知メールを転送するだけでよい場合があります。 + +例 (意訳): + +> Andy さん、先日はアップデートを手伝っていただきまして本当にありがとうございました! +Andy さんの活動の中で修正していただいた _rcs-viewer_ は、おかげさまでより良いものになり、組織の皆さんがその恩恵を享受しています。 +お忙しい中とは存じますが、このような配慮があるからこそ、RCSプロジェクトは会社全体のために機能しています。 +改めまして、誠にありがとうございます! + +## 結果の状況 + +このようなフィードバックは、コントリビューターに素晴らしい気持ちを残し、また貢献しようと戻ってくることにもつながります。 +仲間の前でも、直属の上司の前でも、幅と深さの両方の側面の感謝の言葉を組み合わせることで、認めてもらうことができます。 +またその上司は、他の直属の部下に同じことをするよう促す適切な状況を模索します。 +さらに、インナーソースプロジェクトの意識は、以前はチームの使用とそれとの関わりを知らなかったかもしれないマネージャーにも広がります。 + +一つ注意点があります。 +あなたの言葉は、彼らがしてくれたことに対して、あなたが心の中で感じている心からの感謝からきていることを確認してください。 +褒め言葉も、その人のレベルに合わせて冗長になりすぎないようにしましょう。 +やり過ぎると、不誠実で機械的な印象を与え、せっかく声をかけた意味がなくなってしまいます。 + +## 類似パターン + +* _Just Say Thanks_ ([_Fearless Change_](https://fearlesschangepatterns.com/)より) + +## 事例 + +* Nike (multiple projects) + +## ステータス + +* Structured + +## 著者 + +* Russ Rutledge + +## 謝辞 + +* [Todd Lisonbee](https://github.com/tlisonbee) for encouraging to "keep it real". +* [Isabel Drost-Fromm](https://github.com/MaineC) for [this extra explanation](https://youtu.be/h3MPewsk5PU?t=357) of a "qualified" thank you. + +## 翻訳の履歴 + +- **2022-06-06** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-15** - レビュー [@hirotakatoya](https://github.com/hirotakatoya) diff --git a/translation/ja/patterns/repository-activity-score.md b/translation/ja/patterns/repository-activity-score.md new file mode 100644 index 000000000..6ebec8b13 --- /dev/null +++ b/translation/ja/patterns/repository-activity-score.md @@ -0,0 +1,139 @@ +## Title + +リポジトリアクティビティスコア + +## Patlet + +潜在的なコントリビューターは、彼らの助けを必要とするアクティブなインナーソースプロジェクトを見つけたいと思っています。各プロジェクトのリポジトリのアクティビティスコアを計算することで、プロジェクトのランク付けされたリストを作成することができます (参考: [インナーソースポータル](innersource-portal.md) )、そのため、潜在的コントリビューターは、彼らがコントリビュートしたいプロジェクトをより簡単に決定できます。 + +## 問題 + +**インナーソースのプロジェクトはどのような順番で表示されるべきでしょうか?** *GitHubのスター数*, *フォーク数*, *コミット数*, *コードの行数*, *最終更新日時* などの典型的なKPI は、プロジェクトの活動状況を簡潔に示すには十分ではありません。 + +活発なプロジェクトはもちろん、新しいコントリビューターを必要としているかなり新しく熱心なプロジェクトも、成熟したプロジェクトで活動が少ないものやメンテナンス中のものよりも上位にランクされるべきでしょう。 + +プロジェクトのアクティビティレベルについて、信頼性が高く汎用性のあるスコアを定義するために、いくつかのKPIから派生した新しい評価指標が必要になります。この指標は、プロジェクトのアクティビティレベルに応じて、プロジェクトを分類するために使用されます。 + +## ケーススタディ + +インナーソースが長期間実践されている場合、または特定の数のプロジェクト(意味のあるしきい値を与えるために50としましょう)を超えて拡がっている場合、現在最も人気がありアクティブなインナーソースプロジェクトを見つけるのは困難です。 長い間存在するプロジェクトはよく知られていますが、もはやあまり活発ではないかもしれません。 一方、かなり新しいプロジェクトには、まだ評判や活発なコミュニティがありません。 + +インナーソースプロジェクトのリストは、静的なリソースと考えるべきではありませんが、ちょうどその日の最も興味深いトピックを最初にリストするニュースページのように、新しいアクティブなプロジェクトを発見し探索するためのエキサイティングな場所です。したがって、プロジェクトの順序が定期的に更新され、プロジェクトの人気と活動に応じて変更された場合、それは有益であると言えます。 + +これらの考慮事項を加味し、リポジトリアクティビティスコアを計算する最初のプロトタイプが開発されました。 +このプロトタイプは驚くほどよく機能し、プロジェクトの活動状況に応じて常に変化する順序を決定することができます。 + +## 状況 + +インナーソースプロジェクトの発見は、[インナーソースポータル](innersource-portal.md) と [ギグマーケットプレイス](gig-marketplace.md) パターンで促進されるか、他のコミュニケーションチャネルやプラットフォームでプロジェクトを促進することで可能になります。アクティビティスコアは、プロジェクトがコミュニティに提示されるデフォルトの順序を定義しています。 + +## 組織に働く力学 + +GitHub API で取得できる自動化された KPI は、全ての事柄のうち一部しか示せていません。コードの品質や優れたドキュメントの有無、活発で助け合うコミュニティなど、そのプロジェクトが楽しくコントリビュートできる場所であるかどうかも重要な事項です。 + +このような「ソフトなKPI」は、手動または半自動で計算と結果のスコアに追加する必要があります。もし、コードカバレッジレポートのような、リポジトリにより多くのコンテキストを提供するツールがあれば、簡単に取り入れることができます。 + +## スケッチ + +![リポジトリ活性度スコアのエコシステム](../../../assets/img/repository_activity_score.png) + +こちらはリポジトリアクティビティスコアの計算と適用をまとめたものです。詳しくは、[結果の状況](#結果の状況)をご覧ください。 + +## ソリューション + +リポジトリアクティビティスコアは、インナーソースプロジェクトの(GitHub)活性度を表す数値です。GitHubスター、ウォッチ、フォークなどのリポジトリ統計から自動的に導き出され、他のツールからのKPIや手動評価で付加情報が足されることもあります。 + +さらに、最終更新日やレポの作成日などの活動パラメータを考慮し、多くのトラクションを持つ若いプロジェクトに活力を与えます。 +コントリビューションガイドライン、積極的な参加統計、課題(公開バックログ)を持つプロジェクトも、より高いランキングを受け取ります。 + +これらはすべて、[GitHub search API](https://docs.github.com/en/rest/search#search-repositories) と [GitHub statistics API](https://docs.github.com/en/rest/metrics/statistics) の結果を使って自動的に取得・計算することが可能です。BitBucket、Gitlab、Gerritのような他のコード・バージョニング・システムも、同様のAPIがあれば統合することが可能です。 + +以下のコードでは、変数 `repo` に GitHub `search` API から取得したエンティティを、`Participation` オブジェクトに GitHub `stats/participation` API から取得したエンティティを格納することを仮定しています。 + +必要であれば、ソフトKPI([組織に働く力学](#組織に働く力学)を参照)に従って手動で調整することもできます。 + +``` javascript +// スター数、ウォッチ数、コミット数、およびイシュー数から仮想のInnerSourceスコアを計算します。 +function calculateScore(repo) { + // 初期スコアは 50 にします。GitHub の KPI (フォーク数、ウォッチャ数、スター数) が低い、アクティブなレポジトリをより良いスタート地点にするためです。 + let iScore = 50; + // 重み付け:フォーク数とウォッチ数で最もポイント付けし、次にスター数でポイント付け。オープンなイシューの数でも若干のスコアを加える。 + iScore += repo.forks_count * 5; + iScore += (repo.subscribers_count ? repo.subscribers_count : 0); + iScore += repo.stargazers_count / 3; + iScore += repo.open_issues_count / 5; + + // 過去3ヶ月以内に更新されたもの:総合スコアに0~1の乗数を加える(1=本日更新、0=100日以上前に更新されたもの) + let iDaysSinceLastUpdate = (new Date().getTime() - new Date(repo.updated_at).getTime()) / 1000 / 86400; + iScore = iScore * ((1 + (100 - Math.min(iDaysSinceLastUpdate, 100))) / 100); + + // 過去3ヶ月の参加状況を評価する + repo._InnerSourceMetadata = repo._InnerSourceMetadata || {}; + if (repo._InnerSourceMetadata.participation) { + // average commits: adds a bonus multiplier between 0..1 to overall score (1 = >10 commits per week, 0 = less than 3 commits per week) + let iAverageCommitsPerWeek = repo._InnerSourceMetadata.participation.slice(-13).reduce((a, b) => a + b) / 13; + iScore = iScore * ((1 + (Math.min(Math.max(iAverageCommitsPerWeek - 3, 0), 7))) / 7); + } + + // boost calculation: + // all repositories updated in the previous year will receive a boost of maximum 1000 declining by days since last update + let iBoost = (1000 - Math.min(iDaysSinceLastUpdate, 365) * 2.74); + // gradually scale down boost according to repository creation date to mix with "real" engagement stats + let iDaysSinceCreation = (new Date().getTime() - new Date(repo.created_at).getTime()) / 1000 / 86400; + iBoost *= (365 - Math.min(iDaysSinceCreation, 365)) / 365; + // add boost to score + iScore += iBoost; + // give projects with a meaningful description a static boost of 50 + iScore += (repo.description?.length > 30 || repo._InnerSourceMetadata.motivation?.length > 30 ? 50 : 0); + // 貢献ガイドライン(CONTRIBUTING.md)ファイルを持つプロジェクトに、100の加算点を固定して加える。 + iScore += (repo._InnerSourceMetadata.guidelines ? 100 : 0); + // 非常に活発なプロジェクトは、対数スケールで構成する(発散的だが5000前後で安定する) + if (iScore > 3000) { + iScore = 3000 + Math.log(iScore) * 100; + } + // 最終スコアは0から始まる四捨五入された整数とする(初期値を差し引いた値) + iScore = Math.round(iScore - 50); + // メタデータにスコアを直接追加する + repo._InnerSourceMetadata.score = iScore; + + return iScore; +} +``` + +## 結果の状況 + +コントリビューターは、時間の一部をインナーソースプロジェクトに自由にコミットできます。 彼らはまっさきに彼ら自身のチームの仕事において使っているプロジェクトへのコントリビューションを選ぶかもしれません。しかし、人によってはそれぞれの興味や個人的な開発目標に基づいて、まったく異なる何かにコントリビュートすることを選択するかもしれません。 + +プロジェクトはリポジトリアクティビティスコアで並べ替えて表示できるため、ポータルで意味のある順序を指定して潜在的な新しいコントリビューターに見てもらうことができます。スコアは、プロジェクト進行中に計算することも、すべてのプロジェクトを定期的に評価して結果のリストを保存するバックグラウンドジョブで計算することもできます。 + +定期的にすべてのインナーソースリポジトリ(例: GitHubで特定の[トピック](https://github.com/topics)でタグ付けされたもの)を検索するクローラーも有用な追加機能になりえます。これは、[インナーソース ポータル](innersource-portal.md)のようなツール、検索エンジン、または対話型チャットボットでランク付けされたプロジェクトリストを探せるようにするツールも候補になり得ます。 + +## 理論的解釈 + +リポジトリアクティビティスコアは、GitHub API に基づくシンプルな計算です。完全に自動化することができ、新しい要件にも簡単に対応することができます。 + +## 事例 + +* SAPのインナーソースポータルで、インナーソースプロジェクトのデフォルトの順序を定義するために使用されています。2020年7月に初めて作成され、それ以来、頻繁に微調整や更新が行われています。2020年7月にこのことを InnerSourceCommons に提案したところ、このパターンが確立しました。また、[Michael Graf & Harish B (SAP) at ISC.S11 - The Unexpected Path of Applying InnerSource Patterns](https://www.youtube.com/watch?v=6r9QOw9dcQo&list=PLCH-i0B0otNQZQt_QzGR9Il_kE4C6cQRy&index=6) もご参照ください。 + +## ステータス + +* Structured + +## # 著者 + +[Michael Graf (SAP)](mailto:mi.graf@sap.com) + +## 謝辞 + +InnerSource Commons Community の迅速なアドバイス、そしてこのパターンを養うための多くの有益な意見に感謝します! + +* Johannes Tigges +* Sebastian Spier +* Maximilian Capraro +* Tim Yao + +## 翻訳の履歴 + +- **2022-06-07** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-21** - レビュー [@hirotakatoya](https://github.com/hirotakatoya) diff --git a/translation/ja/patterns/review-committee.md b/translation/ja/patterns/review-committee.md new file mode 100644 index 000000000..08c431f6a --- /dev/null +++ b/translation/ja/patterns/review-committee.md @@ -0,0 +1,63 @@ +## Title + +レビュー委員会 + +## Patlet + +インナーソースの作業モデルは、開発者と管理者のための、より伝統的なアプローチからの抜本的な変革です。インナーソースイニシアチブとそれに参加するビジネスユニットのすべてのシニアマネージャーの間のインタフェースとしてレビュー委員会を確立することにより、マイクロマネジメントを助長することなく、監視と制御の一定レベルを与えるように、イニシアチブに慣れ親しみ、それをサポートできるようになる可能性が高くなります。 + +## 問題 + +管理職は、インナーソースの作業モデルを、彼らが慣れ親しんできた作業モデルからの根本的な逸脱として認識することになるでしょう。その結果、彼らはこの変化のリスクを最小限にしようとするために、インナーソースイニシアチブを拒否またはマイクロマネジメントする可能性があります。 +どちらの場合も、インナーソースの利点を実現することができません。その結果、インナーソースは信用を失うことになります。 + +## 状況 + +A社は、最初のインナーソースの取り組みを導入したいと考えています。A社のほとんどのマネージャーは、オープンソースの作業モデルに慣れておらず、代わりに階層的な、トップダウンのコントロールスタイルの管理に慣れています。 + +## 組織に働く力学 + +- マネージャーがインナーソースイニシアチブでのワークをコントロールしている認識を持てば持つほど、マネージャーは事前の経験がなくてもイニシアチブをサポートする可能性が高くなります。 +- マネージャーは、オープンソースのワークモデルの経験が少ないほど、マネージャーがイニシアチブのリスクを制御したいと思う可能性が高くなります。 +- インナーソースの取り組みがより重労働でマイクロマネジメントされているほど、 オープンソースの作業モデルを必要な範囲で採用できる可能性は低くなります。その結果、InnerSourceのメリットは実現されません。 + +## ソリューション + +- インナーソースイニシアチブに参加するすべてのビジネスユニットのシニアマネージャーで構成されるレビュー委員会を設立します。 +- レビュー委員会メンバーには、どのインナーソースプロジェクトが一般的な支援を受け、特に資金援助を受けるかをグループとして決定する権限が与えられています。 +- 申請者は、会議の前にレビュー委員によって選出され、レビュー委員会の会議でインナーソースプロジェクト案を提示することができます。 +- 現在、レビュー委員会が資金を提供しているインナーソースプロジェクトのリーダーは、毎回のレビュー委員会でプロジェクトの状況について報告することが義務付けられています。 +- レビュー委員は、レビュー委員会において、新規申請者と現在のプロジェクト・リーダーの両方に対して建設的なフィードバックを行う義務があります。 +- すべてのインナーソースプロジェクトは、プロジェクトの早期終了を避けるために、レビュー委員会のあるセッションで受け取ったフィードバックに対して、次のセッションまで反応する機会を与えられることになっています。 +- インナーソースプロジェクトのリーダーは、レビュー委員会で自発的に停止させるための動議を提示することもできます。レビュー委員会は、次に、ソフトウェアを使用するビジネスユニットが、インナーソースコミュニティによる開発の代替ソリューションが見つかるまで、コードベースの開発またはメンテナンスを継続するための手段を講じる時間を与える必要があるかどうかを決定しなければなりません (ビジネス関連またはミッションクリティカルである場合)。 +- レビュー委員会は、定期的に開催されるべきです。年に2回のペースで開催するのが効果的であることが証明されています。 + +![レビュー委員会スケッチ](../../../assets/img/review-committee-sketch.jpg) + +## 結果の状況 + +マネージャーは、インナーソースイニシアチブのために必要な量の情報を取得し、制御するために、使い慣れたツールをインナーソースに適用します。この親しみやすさにより、マネージャーはインナーソースイニシアチブを承認し、インナーソースプロジェクトに必要な自由度を付与する可能性が高くなります。 +開発者は十分に自己組織化することができます。 レビュー委員会はあまり頻繁に招集されないため、マイクロマネジメントは行われません。 + +## 事例 + +* BIOS at Robert Bosch GmbH + +## ステータス + +* Structured +* _Finalized and Reviewed_ as of 8/31/17. + +## 著者 + +- Georg Grütter, Robert Bosch GmbH +- Diogo Fregonese, Robert Bosch GmbH + +## その他の呼び方 + +Cheese Interface + +## 翻訳の履歴 + +- **2022-06-02** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-15** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/service-vs-library.md b/translation/ja/patterns/service-vs-library.md new file mode 100644 index 000000000..2c9c9594e --- /dev/null +++ b/translation/ja/patterns/service-vs-library.md @@ -0,0 +1,80 @@ +## Title + +サービス対ライブラリ + +## Patlet + +DevOps環境のチームは、サービスのダウンタイムに対応する責任が誰にあるのかが曖昧になるため、チームの境界を越えて共通のコードベースで作業することに消極的になる場合があります。解決策としては、同じサービスを独立した環境で展開し、サービスダウン時のエスカレーション・チェーンを別々に構築するか、多くの共有コードを1つのライブラリに集約し、その上で共同作業を行うことが挙げられます。 + +## 問題 + +チームがDevOps環境で作業しているとき、開発者は機能をエンドツーエンドで担当することになります。顧客からデプロイメント、メンテナンス、サポートに至るまでです。このことは、チームの境界を越えて作業する際に課題となります。エスカレーションチェーンは、どちらのチームでも発生するエラーに対して同じではないかもしれません。ソースコードとデプロイメントを結合すると、エラーが発生した場合に誰がオンコールサポートの責任を負うのかという疑問がチームに残ります。その結果、要件に大きな重複がある場合でも、チームは協力し合うことに消極的になってしまいます。 + +## 状況 + +* チームはマイクロサービス環境で働いています。 +* チームは完全に機能する DevOps チームによって編成されています。各チームは、メンテナンス、オンコール、カスタマーサポートを含むエンドツーエンドのコントリビューションに責任があります。 +* あるチームは、他のチームが構築した既存のサービスとよく似たサービスを下流の顧客に提供することを任務としています。 + +## 組織に働く力学 + +* 組織的なエスカレーション経路は、各チームで異なる可能性があります。 +* 各チームのメンバーは、自分たちの顧客に影響を与えないエラーのオンコールサポートに応じないことがあります。 +* 同じ種類のエラーでも、チームや顧客との関係によって SLA の定義が異なるため、深刻度レベルが異なる場合があります。 +* チームによって、セキュリティや規制の制約が異なる場合があります。 + +## ソリューション + +ソースコードとデプロイメントの責任を切り離します。両チームは、重複と相乗効果がある場所を正確に特定するために働きます。 + +共有されたソースコードのみが、責任を共有したインナーソースプロジェクトの一部として保持されます。共有ソースは、すべてのテストコード(可能であれば統合テストを含む)と、コントリビューションの検証を容易にするために可能な限りCIパイプラインを含むという点で、首尾一貫している必要があります。 + +設定とデプロイのパイプラインを、実際のビジネスロジックから切り離します。 +共有したチーム用に、サービスの2つめのデプロイメントを確立します。 + +共通基盤を、両チームで使用するライブラリとして扱い、コードの所有権を共有します。 + +デプロイメント設定をインナーソースポートフォリオの別プロジェクトとして含めることで、チームが議論/共同作業を行ったり、新しいチームがそれをコピーしたりすることができるようになります。 + +## 結果の状況 + +チームは積極的に協力し、ビジネスロジックを実装する作業を共有することで利益を得ることができます。 + +ある環境で動作するように特別に構築されたサービスが、特定のビジネス要件に基づき、より一般的なソリューションに変換されます。 + +両チームは、それぞれのエスカレーションポリシーと展開設定を知ることができ、自分たちの設定に対する改善点を見出すことができる可能性があります。 + +共有されたソースコードに変更が必要な可能性が高まり、実装を改良、改善、最適化する機会がより頻繁に発生するようになる。 + +リリースのパッケージング、遠隔測定、ヘルス/レディネス エンドポイントなど、運用の標準化を段階的に進めることができるようになります。 + +## その他の情報 + +このパターンに関連するものとして、上記を解決するために異なるアプローチをとる[30日の保証期間](30-day-warranty.md) パターンがあります。 + +## 事例 + +* ユーロスペース AG +* Flutter Entertainment: [Flutter インナーソースの応用](https://innersource.flutter.com/sdlc/)には、チーム横断的にコントリビュートする共有コードの"サービスリポジトリ"と、共有リリース成果物をビルドして公開するためのCIパイプラインがあります。各チームは、独自のデプロイメントを定義する"デプロイメント設定"リポジトリを持っています。これは、さまざまな規制要件、サービスおよびインシデント管理の実践、ビジネスの各領域におけるインフラストラクチャのスキルセットによって異なる運用がされています。 + +## ステータス + +* Structured + +## 著者 + +* Isabel Drost-Fromm +* Rob Tuley + +## 謝辞 + +Tobias Gesellchenさん、Europace AGの内部レビューをありがとうございました。 + +## その他の呼び方 + +サービス対ライブラリ: インナーデプロイメントではなくインナー**ソース** + +## 翻訳の履歴 + +- **2022-06-06** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/start-as-experiment.md b/translation/ja/patterns/start-as-experiment.md new file mode 100644 index 000000000..597eeb488 --- /dev/null +++ b/translation/ja/patterns/start-as-experiment.md @@ -0,0 +1,78 @@ +## Title + +実験として始める + +## Patlet + +インナーソースイニシアチブを期間限定の実験として開始し、インナーソースに慣れていないマネージャーがイニシアチブを承認およびサポートしやすくします。 + +## 問題 + +インナーソースイニシアチブは検討されているものの、経営陣がその結果について確信が持てず、その結果として投資にコミットする意思がないため、なかなか開始されません。 + +## 状況 + +会社は、ソフトウェアプロジェクトにおけるコラボレーションの効率を高めるために、InnerSourceを検討しています。しかし、ほとんどの管理者は、オープンソースの作業モデルに精通しておらず、代わりに階層的な、トップダウンの制御スタイルの管理に慣れています。InnerSourceのアイデアは、社内のソフトウェア開発者に非常に人気があり、少なくとも多くの開発者がオープンソースソフトウェアを使用しているか、積極的に開発しているためです。 + +同社は、ソフトウェアプロジェクトでのコラボレーションの効率を高めるためにインナーソースを検討しています。 ただし、ほとんどのマネージャーはオープンソースの作業モデルに精通しておらず、代わりに階層的なトップダウンの制御スタイル管理に慣れています。インナーソースのアイデアは、社内のソフトウェア開発者に非常に人気があります。その理由は特に、多くの開発者がオープンソースソフトウェアを使用または積極的に開発しているためです。 + +## 組織に働く力学 + +- マネージャーは長期的な投資を行う前に、インナーソースを用いたコラボレーションにおいて効果が期待できるかを検証する必要があります。これには通常、改善したかを測定することが含まれます。 +- インナーソースイニシアチブが開発者の間で大きな支持を得る可能性が高く、多くのプロジェクトがそれに依存する可能性が高い場合、それをシャットダウンする決定は非常に不人気であり、実施するのは困難でしょう。導入した結果、コントロールを失う可能性が認識される場合、一部のマネージャーはインナーソースを始めることさえ思いとどまる可能性があります。 +- インナーソーススタイルの作業モデルの実装は、以前に実践されていた作業モデルからの根本的な逸脱であることがよくあります。したがって、既存の必須プロセスはもはや適用できず、適切な管理プロセスが失われてしまう可能性があります。その結果、規制や、時には法的規制のない場所で活動しなければならなくなるかもしれません。例えば、複数の国に複数の法人を持つ大企業では、税金や輸出管理関連の規制があります。 + +## ソリューション + +インナーソースイニシアチブを期間限定の実験として宣言します。インナーソース実験に参加するプロジェクトの基準を定義し、伝達します。健全なコミュニティを構築する可能性を最大化する基準を選択してください。実験の文脈の中でそこから生み出された洞察が、他のインナーソースプロジェクトの可能性を含む文脈に直感的に適用できるならば、一連の基準は良いものであると言えるでしょう。 +このような基準の例は次のとおりです。 + +- 開発者の十分な地理的分布 +- 開発者の十分な部門別構成 +- コミュニティ内の風通しの良さ +- コミュニティ内での能力に応じたキャリアパス +- コミュニティ内での民主的な意思決定 + +再評価するために、実験のおわりを _ピボット_、 _変更_ 、または _一時停止_ のポイントに指定することを検討してください。また、参加を通じて経営陣の賛同の機会を増やすために、[レビュー委員会](review-committee.md)を設立することを検討してください。企業の文化によっては、[適切なメトリック](../../../patterns/1-initial/introducing-metrics-in-innersource.md)を使用して実験を行うことが役立つ場合があります。実験のプロジェクトが企業の収益に直接影響を与えない場合は、[チーム間のプロジェクト評価](crossteam-project-valuation.md)を導入して、その価値への貢献を強調することを検討してください。 + +## 結果の状況 + +マネージャーが、インナーソースをキックスタートできる理由になりうるのは以下です。 + +* インナーソースプログラムを以前の典型的なプロジェクトのように精査することが実験的なセットアップにより緩和されます。 +* 実験の失敗の可能性が理解され、受け入れられているので、サポートするマネージャーの個人的なリスクが最小限に抑えられます。 +* 失敗した場合でも、実験的なセットアップにより、会社は失敗から学ぶことができます。 +* 成功した場合、実験中に収集されたデータによって、マネージャーはインナーソースに対してより長期的なコミットメントを行うことができます。 + +インナーソースの実験参加者は、インナーソースが約束された利益をもたらすことを経営陣に証明する必要があることを認識しています。 したがって、最も実証可能な価値を提供し、成功の可能性を高める活動に集中するのに役立ちます。 +また最後に、実験として開始すると、成功の可能性を減らすかもしれないツールやプロセスポリシーなどの規制や力を回避することがはるかに簡単になります。 + +## Related Patterns + +- _Trial Run_ (書籍 [Fearless Change](https://fearlesschangepatterns.com/) より) + +## 事例 + +- Robert Bosch GmbH (グローバルな分散型ソフトウェア開発組織を有する) + +## ステータス + +* Structured + +## 著者 + +- Georg Grütter (Robert Bosch GmbH) + +## 謝辞 + +- Jason Zink (Robert Bosch GmbH) +- Diogo Fregonese (Robert Bosch GmbH) +- Robert Hansel (Robert Bosch GmbH) +- Hans Malte Kern (Robert Bosch GmbH) +- Russ Rutledge (Nike) +- Tim Yao (Nokia) +- Clint Cain (Optum) + +## 翻訳の履歴 + +- **2022-06-03** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) diff --git a/translation/ja/patterns/transparent-cross-team-decision-making-using-rfcs.md b/translation/ja/patterns/transparent-cross-team-decision-making-using-rfcs.md new file mode 100644 index 000000000..431198ae2 --- /dev/null +++ b/translation/ja/patterns/transparent-cross-team-decision-making-using-rfcs.md @@ -0,0 +1,128 @@ +## Title + +RFCを用いたチーム横断的な意思決定の透明化 + +## Patlet + +高い参加率を達成し、関係者全員にとって最良の意思決定を行いたいインナーソースプロジェクトは、ソフトウェアのライフサイクル全体を通して参加型のシステムを構築する方法を見つける必要があります。内部のRFC(Requests for Comments)ドキュメントを公開することで、設計プロセスの早い段階から議論を行うことができ、関係者全員が高いコミットメントを持ってソリューションを構築できる可能性が高まります。 + +## 問題 + +インナーソースプロジェクトが健全であるためには、相当な数のコントリビューターが必要です。しかし、コントリビューターが増えると、例えば互いに互換性のない機能をプロジェクトに追加したり、アーキテクチャを不健全に肥大化させたりする可能性があります。 +このような意見の相違や誤解をプロセスの後半で発見した場合、特にソフトウェアがすでに構築された後では、修正に非常にコストがかかってしまいます。このような意見の相違は、関係者全員のフラストレーションにつながり、プロジェクトにおけるコラボレーション文化の健全性を損なう可能性さえあります。 +このような不一致が表面化する時によくあるケースとして、変更リクエストの作成者とプロジェクトのメンテナーが、提案された変更を行うべきであるということに本質的に同意していないために、非常に長い間オープンになっている変更リクエスト(プルリクエスト) が存在するなどがあります。 + +インナーソースプロジェクトでは、社内の複数のチームによってプロジェクトが維持されている場合、このような状況がより頻繁に発生します(共有オーナーシップ)。 + +## ケーススタディ + +プロジェクト、または複数のプロジェクトで構成されるアプリケーションは、多くの異なるチームによって維持され、各チームはプロジェクトまたはアプリケーションの異なる領域を所有し管理します。これらのチームは、お互いの領域にインナーソースの貢献をしますが、より大きな分野横断的な変更は、チームの技術リーダーが協力することによってのみ推進されるか、もしくはそもそもまったく発生しません。その結果、ほとんどのエンジニアは大規模で分野横断的な変更を行うことができなくなり、イノベーションとコラボレーションの機会が減少します。 + +ここで RFC のプロセスとテンプレートを導入することで、チームや個人は、透明性のある意思決定プロセスを通じて、大規模で横断的な変更を提案する権限を与えられ、チーム間で非同期的に協議が行われます。その結果、イノベーションが促進され、コラボレーションが緊密になり、知識がより広まることになります。このためには、あらゆるレベルのあらゆる分野から賛同を得ること、そして人々がオープンにアイデアを提案し、議論できるような心理的安全性の高い環境を整えることが必要です。 + +どのようなプロセスでもそうですが、これは継続的に改善されなければなりません。RFC のテンプレートやプロセスを変更して、包括的、協調的、かつ効果的なものにする必要があるかもしれません。 + +## 状況 + +* インナーソースプロジェクトは多くのチームによって共有されています。 +* アーキテクトグループは十分な時間がなく、またすべてのケースで適切な判断を下すのに十分なドメイン固有の知識もないため、包括的な設計上の決定を常に中央の組織(アーキテクトグループなど)から行うことはできません。 +* あるプロジェクトの方向性については、さまざまなタイプのユーザーが意見を述べます。そのようなユーザーには開発者、プロダクトオーナー、プロダクトマネージャーなどがいます。 +* 参加者全員と頻繁に同期ミーティングを開くことが不可能なため、少なくとも部分的には非同期で意思決定を行う必要があります。 +* 決定事項を文書化したい、つまり口頭だけでなく文書で確認したいと感じています。 + +## 組織に働く力学 + +* ほとんどの場合、関係者はかなり迅速に決定を下したいと思っています (例: 事前の設計時間はかなり限られています) +* 関係者の多くにとって、(すでに実装されていない)物事を書き留めることは新しいスキルであることが多いです。 + +## スケッチ + +![RFC process used at Uber's BaseUI project (open source example)](../../../assets/img/rfc-process-uber-baseui.png) + +## ソリューション + +チーム横断的な意思決定プロセスの透明性を高めるために、RFC的なプロセスを採用します。([Requests for Comments][requests-for-comments]もご参照ください) + +このソリューションの重要な要素は以下の通りです。 + +* RFC を発行する場合(および発行しない場合)の説明 +* RFCドキュメントのテンプレート + * RFC の作成者に、自分の提案を多角的に検討するよう促す必要があります。 + * ハイレベルでアクセスしやすい概要と、詳細で深い説明の両方を促す必要があります。 +* RFC を取り巻くよく知られた軽量なプロセス + * RFC を公開し、すべての関係者と共有する方法 (例: Slack、メーリングリスト) + * RFC に対するフィードバックをどのように収集するか + * どのようにフィードバックを取り込むか + * 結論や決定に向けて RFC をどのように進めるか (例: 関連する指名されたメンテナーが承認すること) + * 適切なツールの選択 (例: 非エンジニアはソースコントロールツールにアクセスできないかもしれません) +* RFC のテンプレートとプロセスを繰り返し使用することを約束すること + +### Examples/Templates + +- [Rust][rust] は RFC テンプレートとプロセスの優れたオープンソース例であり、他の多くの RFC プロセスの基礎となっています。 +- [一般化された BBC iPlayer & Sounds RFC テンプレート](../../../patterns/2-structured//templates/rfc.md) (元々はRustテンプレートに基づいています) + +## 結果の状況 + +RFC のようなプロセスを導入することで、チーム横断的な意思決定プロセスがより透明化され、すべての人の声を聞くことができるようになり、価値があることが証明されました。 + +観察できるポジティブな効果 + +* 多くのチームに影響を与える**意思決定プロセスを民主化**します(チームリーダーの負担を軽減)。 +* 複数のチームや地域にまたがって機能する**オープンな非同期コミュニケーション手法**になります。 +* **個人とチーム**が大規模な**変化を起こせるように**します。 +* **決定事項を記録**し、その内容を参照することができます。 +* **経験豊富なエンジニア**が、ミーティングに出席する必要がなく、非同期かつリモートでソリューションに貢献できるため、その**影響力を拡大**することができます。 +* 例えば、"システムテストとは何か" などのテスト用語を定義しておくことで、**用語の整合性を図る**ことができます。 +* **プロセスの整合性**を図ります。 例えば時間外サポートのプロセスを明示するなどが挙げられます。 +* RFC を書くことで、著者が自分自身に挑戦することになり、**思考がより明確に**なります。 + +一方で RFC のアプローチにはリスクも存在しますので、以下に注意も喚起したいと思います。 + +* この方法はいつもうまくいくとは限りません。例えば、RFCを通じてすでになされた決定に対して異議を唱える人がいるかもしれません。しかし、意思決定のプロセスを文書化しておくことは、このようなシナリオでも有益です。ある決定がいつ、なぜなされたかを人々に示すことができるからです。 +* 設計案 (アーキテクチャ、プロトコルなど) を前もって書き上げることは、ウォーターフォールのような設計の要素があり、多くの開発チームが好む反復的なアジャイルの開発アプローチには適さない場合があります。[アジャイルマニュフェスト](https://agilemanifesto.org/)に存在する「括的なドキュメントよりも、動くソフトウェアを」という項目は覚えておいてください。RFC プロセスは可能な限り軽量であるべきです。 +* RFC は大きくなりすぎて扱いにくくなる可能性があります。これはしばしば、長いコメントスレッドやそれをめぐる議論に表れます。そのような状況では、ワーキンググループや直接のミーティングなど、同期的なコミュニケーションで RFC を補完することを決定することもあります。しかし、ミーティング中にすべての情報を共有するのではなく、ミーティングの前に RFC を読むことができるので、時間はいずれにせよ節約されていることになります。 + +## 理論的解釈 + +RFCは、長年にわたってオープンソースの世界でその効果が証明されてきました。これは、RFCが標準の開発に役立ってきたインターネット全体にも当てはまるほか([例: RFCの30年を参照][30-years-of-rfcs])、コミュニティにおける透明な意思決定を促進するためにこの方法を適応させてきたその他のオープンソースプロジェクト([RUST][rust], [ZeroMQ][zeromq])にも当てはまります。 + +インナーソースの文脈では、[Uber][uber] や [Europace][europace] など、様々な企業が RFC のようなアプローチの経験を有しており、共有しています。 + +また、純粋なソフトウェア設計の決定以外にかかる意思決定においても、透明性のある意思決定モデルは、例えばオープンな組織に向けて取り組む際に効果的です。例として、Red Hatの [Open Decision Framework][open-decision-framework] (2016年6月7日に公開)をご覧ください。 + +## 事例 + +* **BBC iPlayer & Sounds** - ISC Fall Summit 2020 のプレゼンテーションをご参照ください - [Using Internal RFCs to Enhance Collaboration][bbc] +* **Europace** - Open Organizationの項目で述べられています - [Setting cross-team standards and best practices in the open][europace]. +* **Uber** - Gergely Orosz さんの記事をご覧ください [Scaling Engineering Teams via RFCs: Writing Things Down][uber]. +* **Google Design Docs** - Malte Ublさんの記事をご覧ください [Design Docs at Google][google] + +## ステータス + +Structured + +## 著者 + +* Tom Sadler +* Sebastian Spier + +## その他の呼び方 + +* [デザインとキュメント][google] +* アーキテクチャの決定記録(ADR: Architecture Decision Record) - 意見を求め、合意を形成するための RFCです。決定と実装の詳細を記録するための ADR など、非常に異なる使い方をすることがあるため、必ずしも直接的な類例ではありません。 + +[requests-for-comments]: https://en.wikipedia.org/wiki/Request_for_Comments +[30-years-of-rfcs]: https://www.rfc-editor.org/rfc/rfc2555.txt +[rust]: https://github.com/rust-lang/rfcs +[zeromq]: https://rfc.zeromq.org +[uber]: https://blog.pragmaticengineer.com/scaling-engineering-teams-via-writing-things-down-rfcs/ +[europace]: https://github.com/open-organization/open-org-distributed-work-guide/blob/master/drostfromm-remote-first-through-openess.md#setting-cross-team-standards-and-best-practices-in-the-open +[open-decision-framework]: https://www.redhat.com/en/about/press-releases/red-hat-releases-open-decision-framework-spur-transparent-and-inclusive-leadership +[bbc]: https://www.youtube.com/watch?v=U6zlghE0HcE +[google]: https://www.industrialempathy.com/posts/design-docs-at-google/ + +## 翻訳の履歴 + +- **2022-06-07** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) +- **2022-06-13** - レビュー [@kanazawazawa](https://github.com/kanazawazawa) diff --git a/translation/ja/patterns/trusted-committer.md b/translation/ja/patterns/trusted-committer.md new file mode 100644 index 000000000..54d9ad4d8 --- /dev/null +++ b/translation/ja/patterns/trusted-committer.md @@ -0,0 +1,129 @@ +## Title + +トラステッドコミッター + +## Patlet + +多くのInnerSourceプロジェクトは、コントリビューターからフィードバック、機能、バグフィックスを一貫して受け取る状況にあります。このような状況で、プロジェクトのメンテナーは、単一のコントリビューションを越えてコントリビューターの仕事を認識し、報酬を与える方法を模索します。 + +## 問題 + +- プロジェクトメンテナーは、プロジェクトをサポートする力をスケールする方法を探しています +- プロジェクトメンテナーは、プロジェクトが提供する価値を高める方法を見つけたいと思っています +- プロジェクトメンテナーは、頻繁に貢献している人に目に見える形で報い、彼らの価値貢献を拡大させる力を与えたいと考えています +- 組織内のチーム間の貢献を認識するための仕組みや言語がない + +## 状況 + +- あなたはチーム横断的なライブラリ、サービス、または共有リソースのメンテナーです +- あなたは定期的にコントリビューションを受けます +- あなたは定期的に機能のリクエストを受けます +- あなたは定期的にバグフィックスのリクエストを受けます +- InnerSource プロジェクトを通じて専門知識を身につけようとする意欲的なコントリビューターがいます + +## 組織に働く力学 + +- プロジェクトのライフサイクルの中で、変化するビジネスの優先順位に対応するため、メンテナーのフォーカスがずれることがあります +- コントリビューターは、自分たちのコントリビューションが目に見える形で認められ、その価値が示されることを求めています +- 小規模なチームにとって、それなりに複雑なプロジェクトを維持することは大きな負担になります +- プロジェクトの機能を大規模に開発することは、小規模なチームにとって負担になります + +## ソリューション + +### プロジェクトの トラステッドコミッターの役割を定義する + +トラステッドコミッターが何を担当するかは、各プロジェクトとそのメンテナー次第です。トラステッドコミッターの役割の範囲について、プロジェクト内で文書化することを忘れないようにしましょう。明確な文書化によって、新しいコミュニティのメンバーに対する期待値を設定し、将来の候補者のために役割を確立します。 +トラステッドコミッターの候補者を特定するためのガイドラインは以下のとおりです。 + +* コミュニティチャネル (Slack、JIRA issue triaging など) に積極的に参加している人はトラステッドコミッターになり、コミュニティサポートにおける役割を正式に決定することができます +* コード、ドキュメント、その他のリポジトリの変更を頻繁に提供する人をプルリクエストに参加させることから始めましょう。この人が積極的にプルリクエストに参加している場合、プロジェクトにおけるさらなるコラボレーションの機会についてアプローチすることを検討してください + +### 信頼できるコミッターを正式に認定する + +最初のステップは、トラステッドコミッターになることについて候補者にアプローチすることです。メンテナーは候補者にトラステッドコミッターの役割について理解してもらう必要があります。候補者がトラステッドコミッターの役割を引き受けることを期待してはいけません。各候補者は、自分がその責任を果たすために必要な余剰リソースを持っているかどうかを判断する必要があります。 + +候補者がその役割を引き受けた場合、"ユーザー" からトラステッドコミッターへの移行を公の場でアナウンスするかはプロジェクトのメンテナー次第です。また、プロジェクトの README にある [トラステッドコミッター] セクションに名前を追加することもお勧めします。 + +例としては以下のようなものがあります。 + +```markdown +# プロジェクト名 + +... Readme ... + +## プロジェクトリーダー + +### メンテナー + + - チームメンバー + +###トラステッドコミッター + + - 新しいトラステッドコミッター + +[トラステッドコミッター]: https://example.com/link/to/your/trusted/committer/documentation.md +``` + +### トラステッドコミッターとの関係を維持する + +トラステッドコミッターを正式に決めたら、 その人たちをプロジェクトの輪の中に入れておくとよいでしょう。プロジェクトの輪を保つには、プロジェクトチャンネルに招待するといった簡単なものから、企画セッションに参加させるといったものまであります。参加する機会を増やすことで、トラステッドコミッターが望めばメンテナーになる道も開けます。 +トラステッドコミッターに情報を提供するだけでなく、定期的にチェックインをするのもよいでしょう。最初は一週間に一度、そして徐々に数週間に一度のペースをおすすめします。 +これらのチェックインの目的は、トラステッドコミッターが新しい役割において自分が周囲からのサポートを受けていると感じられるようにすることです。上司との1:1ミーティングと同じように、何か問題があれば、耳を傾け、共感して、トラステッドコミッターが成功するのを妨げているものを理解しようと努めましょう。プロジェクトを成功に導くための[トラステッドコミッターのチームへの継続的な貢献に感謝し][praise]、新しいチェックインの日付を設定しましょう。 + +### トラステッドコミッターの退任 + +トラステッドコミッターが以下のような場合、トラステッドコミッターを退任させなければならないことがあります。 + +- 参加する意思がなくなった +- 責任を果たせなくなった +- 会社の従業員ではなくなった + +プロジェクトのリソースへのアクセス権を解除するプロセスについては、プロジェクトの **トラステッドコミッター** セクションにあるエントリを"過去のコントリビューター"のリストに移行させるなど、両者で事前に合意しておく必要があります。 +アクセス権を解除する際には、[トラステッドコミッターの参加に対して公の場で感謝の意を表する][praise]ことで、移行と継続性をコミュニティ内で明確に周知することができます。 + +## 結果の状況 + +### コントリビューターに対して + +プロジェクトのトラステッドコミッターとなることは、コミュニティプロジェクトにコントリビュートするイニシアチブを示すことになります。このような貢献は、上司との年次レビューでの評価に組み込むなどの利用が可能です + +### メンテナーに対して + +プロジェクトが成熟するにつれて、 メンテナーはプロジェクトの重要な側面についてあまりよく知らなくなることがあります。トラステッドコミッターはこのようなギャップを埋め、プロジェクトのあらゆる側面をより良くすることができます。 +トラステッドコミッターを健全に組織に配置することは、メンテナンス担当者が進むにあたり、職務遂行のための責任がある管理計画の所在を保証することになります。 + +## 事例 + +この事例は、試行錯誤のすえ以下の企業で成功しています。 + +- Nike +- PayPal + +## ステータス + +- Structured +- Nike の社内で公開、2018年6月にプルリクエストで起草 + +## 著者 + +- [Fernando Freire] + +## 謝辞 + +- [Russell Rutledge] +- [Loren Sanz] +- [Noah Cawley] +- [Jeremy Hicks] +- [Doron Katz] + +[Doron Katz]: https://github.com/doronkatz +[Russell Rutledge]: https://github.com/rrrutledge +[Loren Sanz]: https://github.com/mrsanz +[Jeremy Hicks]: https://github.com/greatestusername +[Noah Cawley]: https://github.com/utanapishtim +[praise]: ./praise-participants.md +[Fernando Freire]: https://github.com/dogonthehorizon + +## 翻訳の履歴 + +- **2022-05-30** - 翻訳 [Yuki Hattori](https://github.com/yuhattor) diff --git a/translation/ja/templates/CONTRIBUTING-template.md b/translation/ja/templates/CONTRIBUTING-template.md new file mode 100644 index 000000000..f5cad9b34 --- /dev/null +++ b/translation/ja/templates/CONTRIBUTING-template.md @@ -0,0 +1,37 @@ +# ____ にコントリビュートするには + +## コントリビューションの種類 + +プロジェクトがどのような種類のコントリビューションを求めているのか、ここに情報を提供してください。例えば、バグレポート、ユーザーの質問に対する回答、ドキュメントの改善、バグの修正、新機能の実装などです。 + +## バグレポート + +バグレポートの提出方法に関する情報をここに追加してください。これには、問題を再現し修正するためにプロジェクトがどのような情報を必要とするかについてのヒントが含まれるべきです。また、よく見られるバグのような設定ミスの情報も含めることができます。 + +また、初動までの時間やその後のプロセスなどに関して、コントリビューターが期待すべき情報についても記載してください。 + +## 機能リクエスト + +機能リクエストを提出する方法についての情報をここに追加してください。また、初動までの時間やその後のプロセスなど、コントリビューターが期待すべき情報についても記載してください。 + +## ドキュメントに対するコントリビューション + +プロジェクトが遵守しているドキュメントのベストプラクティスや、ドキュメントの構築方法、チェック方法、プロジェクトに変更を戻す方法などの情報を含めてください。 + +## ソースコードに対するコントリビューション + +このセクションでは、以下の情報を提供します。 + +- プロジェクトのソースコードにアクセスする方法 +- プロジェクトの一般的なレイアウト +- 開発環境に対する要求事項 +- コードの書式に関するガイドライン +- テストの実行方法 + +## トラステッドコミッターになるには + +このセクションでは、トラステッドコミッターになるためのプロセスがコントリビューターに開かれている場合、そのプロセスを明示する必要があります。 + +## トラステッドコミッターをノミネーションする方法 + +このセクションは、既存の トラステッドコミッターへのリマインダーと、新しい トラステッドコミッターへの説明として、他のメンバーをホストチームに追加する方法について説明するものです。繰り返しになりますが、この情報は組織内のすべてのプロジェクトで同じものであることが理想的で、ここから中央の情報にリンクさせることができます。 diff --git a/translation/ja/templates/README-template.md b/translation/ja/templates/README-template.md new file mode 100644 index 000000000..f09bf6f5d --- /dev/null +++ b/translation/ja/templates/README-template.md @@ -0,0 +1,49 @@ +# ここにプロジェクトの名前を入れてください + +## ミッション + +あなたのプロジェクトのミッションについての簡潔な(3〜5行の)説明が含まれている必要があります。このセクションのゴールは、あなたが何に取り組む予定かを述べ、外部のコントリビューターがこのプロジェクトに歓迎されそうな機能の種類をおおよそ理解できるようにすることです。 +Producing Open Source Software の [Mission Statement Chapter](https://producingoss.com/en/producingoss.html#mission-statement) も参照してください。 + +## はじめに + +このセクションには、初めてプロジェクトを使う人に向けた、使い始めるための簡単な説明を記載します。さらに詳細なドキュメントにはここからリンクをさせましょう。 + +## 詳細 + +このセクションでは、以下のいずれか、またはすべてを列挙することができます。 + +- ソフトウェアが対応する機能、ユースケースのリスト +- トレードオフを解決するために使用される設計原理に関する情報 +- ユーザーレベルのドキュメントへのリンク +- よくある質問(FAQ)に対する回答。できれば、特定の質問とその回答にリンクして、簡単に参照できるようにした形式が望ましいです。 + +## ヘルプ + +このセクションには、ユーザーとしてプロジェクトのヘルプを得る方法についての簡単なドキュメントを記述します。 +イシュートラッカーをユーザーに対して指し示すようにシンプルなディレクションでもかまいません。また、アーカイブされ検索可能なチャットチャネルとメーリングリスト、オンラインのユーザーフォーラムを紹介することもできます。 + +## 参加するには + +このセクションには、プロジェクトと連絡を取る方法に関する情報を含める必要があります。通常これにはアーカイブされた検索可能およびアクセス可能なコミュニケーションチャネルへのリンクが含まれます。 + +## 私たちについて + +このページは、プロジェクトのトラステッドコミッターに謝意を表すのに良い場所です。 +また、このプロジェクトにおいてトラステッドコミッターであることが何を意味するのかについての情報を含めるのにも良い場所です。 理想的には、組織内のすべてのプロジェクトが同じ定義を使用のが良いでしょう。その場合、すべての README が同じ定義へのリンクを貼ることになります。 このリンクを残す理由は、インナーソースのプロジェクトで働いたり貢献した経験がない、もしくは少ない同僚が、日々の仕事に必要な技術プロジェクトから会社全体の情報へのダイレクトリンクを持てるようにするためです。 + +## コントリビューションについて + +このセクションでは、初めての人がコントリビュートを始めるために知っておく必要があるすべての事柄についてドキュメント化(もしくはリンクを貼る)する必要があります。 以下のトピックのすべてがカバーされることは希ですが、あなたのプロジェクトが標準的なセットアップと何が違うのか、以前のコントリビューターが理解しにくいと感じたことに重点を置いて書いてください。 + +- ソースコードを見つける方法 +- プロジェクトで助けを必要としている問題のリストを見つける方法。これらの問題は、技術的・非技術的な両方の問題になりえます。通常、これらの問題は、コントリビューターがアクセスできるイシュートラッキングシステムも掲載されます。 +- プロジェクトのアーキテクチャ、一般的なコーディング規約、テスト規約など、さらなるドキュメントへのリンク +- 技術的なコンとリビューションについて、変更を加え、プロジェクトをビルドし、変更をテストする方法 +- 変更した内容をプロジェクトにサブミットする。 + +理想的には、プロジェクトにとって望ましい変更プロセスがどのようなものであるかについての情報も含めてください。コントリビューターはまずイシューを作成して提案を提出すべきなのか、それともすぐにでも変更を提出することができるのか。投稿をレビューする際に重要なことは何ですか? + +さらに、プロジェクトで守りたい設計の価値観についても概要を説明しておく必要があります。これらを明示することで、トレードオフをより早く、より簡単に解決できることがよくあります。さらに、暗黙の前提に対する変更を透明化するのにも役立ちます。 + +時間が経つにつれて、このセクションがかなり大きくなっていることに気がつくと思います。その場合は、例えば `CONTRIBUTING.md` と `TESTING.md` のように、情報を別のファイルに移動することを考えてみてください。