From 1cd27f77ed844773a969210a11de0d8bb98ac98f Mon Sep 17 00:00:00 2001 From: Jens Tirsvad Nielsen Date: Wed, 7 Oct 2026 12:30:58 +0800 Subject: [PATCH 1/2] Plan MIL-007 and UC-002; AGPL-3.0 default only for a public GitHub project - MIL-006: the AGPL-3.0 default needs GitHub and a public project - MIL-007: fetch the framework's own submodules (qc); start through a command link; README usage - UC-002 with SSD, DM, OC, SD and DCD; US-001.07 and US-002 - Reconcile the project DM, DCD, dictionary, use case diagram and traceability matrix - Review records RC-022 to RC-028 --- docs/artifact-registry.md | 16 ++-- docs/business-case.md | 18 ++-- docs/dcd.md | 37 ++++++-- docs/dictionary.md | 9 +- docs/domain-model.md | 35 ++++++-- docs/milestones/mil-006-project-license.md | 11 +-- .../mil-007-framework-checklists.md | 81 +++++++++++++++++ docs/project-plan.md | 19 ++-- docs/sqa/reviews/rc-022-mil-007.md | 71 +++++++++++++++ docs/sqa/reviews/rc-023-uc-002.md | 62 +++++++++++++ docs/sqa/reviews/rc-024-ssd-002.md | 49 +++++++++++ docs/sqa/reviews/rc-025-dm-003.md | 73 ++++++++++++++++ docs/sqa/reviews/rc-026-oc-002.md | 57 ++++++++++++ docs/sqa/reviews/rc-027-sd-002.md | 50 +++++++++++ docs/sqa/reviews/rc-028-dcd-003.md | 62 +++++++++++++ docs/sqa/traceability-matrix.md | 44 +++++++--- docs/uc-001/dm.md | 5 +- docs/uc-001/oc.md | 8 +- docs/uc-001/sd.md | 5 +- docs/uc-001/ssd.md | 5 +- docs/uc-001/uc.md | 13 +-- docs/uc-002/dcd.md | 87 +++++++++++++++++++ docs/uc-002/dm.md | 84 ++++++++++++++++++ docs/uc-002/oc.md | 53 +++++++++++ docs/uc-002/sd.md | 84 ++++++++++++++++++ docs/uc-002/ssd.md | 50 +++++++++++ docs/uc-002/uc.md | 74 ++++++++++++++++ docs/use-case-diagram.md | 11 ++- docs/user-stories.md | 55 +++++++++--- 29 files changed, 1143 insertions(+), 85 deletions(-) create mode 100644 docs/milestones/mil-007-framework-checklists.md create mode 100644 docs/sqa/reviews/rc-022-mil-007.md create mode 100644 docs/sqa/reviews/rc-023-uc-002.md create mode 100644 docs/sqa/reviews/rc-024-ssd-002.md create mode 100644 docs/sqa/reviews/rc-025-dm-003.md create mode 100644 docs/sqa/reviews/rc-026-oc-002.md create mode 100644 docs/sqa/reviews/rc-027-sd-002.md create mode 100644 docs/sqa/reviews/rc-028-dcd-003.md create mode 100644 docs/uc-002/dcd.md create mode 100644 docs/uc-002/dm.md create mode 100644 docs/uc-002/oc.md create mode 100644 docs/uc-002/sd.md create mode 100644 docs/uc-002/ssd.md create mode 100644 docs/uc-002/uc.md diff --git a/docs/artifact-registry.md b/docs/artifact-registry.md index c99d437..5a92c3a 100644 --- a/docs/artifact-registry.md +++ b/docs/artifact-registry.md @@ -14,17 +14,17 @@ document of a type. `Primary File` may contain a glob (e.g. | BC | Business Case | docs/business-case.md | 002 | | SA | Stakeholder Analysis | docs/stakeholder-analysis.md | 002 | | PP | Project Plan | docs/project-plan.md | 002 | -| MIL | Milestone / Gateway | docs/milestones/*.md | 007 | +| MIL | Milestone / Gateway | docs/milestones/*.md | 008 | | US | User Story | docs/user-stories.md | 002 | -| UC | Use Case | docs/uc-*/uc.md | 002 | -| SSD | System Sequence Diagram | docs/uc-*/ssd.md | 002 | -| OC | Operation Contract | docs/uc-*/oc.md | 002 | -| SD | Sequence Diagram | docs/uc-*/sd.md | 002 | -| DM | Domain Model | docs/domain-model.md | 003 | -| DCD | Design Class Diagram | docs/dcd.md | 003 | +| UC | Use Case | docs/uc-*/uc.md | 003 | +| SSD | System Sequence Diagram | docs/uc-*/ssd.md | 003 | +| OC | Operation Contract | docs/uc-*/oc.md | 003 | +| SD | Sequence Diagram | docs/uc-*/sd.md | 003 | +| DM | Domain Model | docs/domain-model.md | 004 | +| DCD | Design Class Diagram | docs/dcd.md | 004 | | DICT | Domain Dictionary (PO and IT terms) | docs/dictionary.md | 002 | | UCD | Use Case Diagram | docs/use-case-diagram.md | 002 | -| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 022 | +| RC | SQA Review Record | docs/sqa/reviews/rc-*.md | 029 | | TM | Traceability Matrix | docs/sqa/traceability-matrix.md | 002 | ## Languages diff --git a/docs/business-case.md b/docs/business-case.md index 9f0d9cc..a2f6607 100644 --- a/docs/business-case.md +++ b/docs/business-case.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Added objective 9 (credentials asked, project .env created), scope items, success criterion 9 and a risk
Objective 6 and success criterion 1 now allow a token only in the new project's .env | [ded26a6] | -| 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Added objective 10 (PROJECT_LICENSE in config.env), a scope item and success criterion 10; objective 2 now names the configured license | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Objectives 2, 5 and 10, two scope items and success criterion 10: the AGPL-3.0 default needs GitHub and a public project; the framework's own submodules (qc) are fetched | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added objective 11 (global command, project created in the current folder), a scope item and success criterion 11 | pending | --- @@ -35,15 +35,16 @@ One repeatable, reviewed procedure gives every new project the same secure basel ## Objectives 1. Optionally create an empty GitHub repository under a chosen user or organization. -2. Create a Gitea repository under a chosen user or organization, empty, or with a license: the one set in `config.env` (`PROJECT_LICENSE`), or AGPL-3.0 when GitHub is chosen and none is set. +2. Create a Gitea repository under a chosen user or organization, empty, or with a license: the one set in `config.env` (`PROJECT_LICENSE`), or AGPL-3.0 when GitHub is chosen, the project is public and none is set. 3. When GitHub was chosen, configure the Gitea repository as a push mirror to GitHub (direction Gitea to GitHub). 4. Create the local project directory with an `origin` (Gitea) remote and, when GitHub was chosen, a `github` remote, neither containing credentials. -5. Add the SQA-QC-Framework as the `framework` submodule, install its skills and git hooks, and copy its templates, optionally enabling the plan gate. +5. Add the SQA-QC-Framework as the `framework` submodule with its own submodules (the `qc` checklists) fetched, install its skills and git hooks, and copy its templates, optionally enabling the plan gate. 6. Never print a token or put one in a URL, a remote or a log, write one to disk only in the new project's own `.env` and only after the Maintainer agrees, and never overwrite existing files or directories without consent. 7. Document installation, configuration, usage, security decisions and error handling in clear English for GitHub readers. 8. Let the Maintainer preset the project details in `config.env`, so that a detail that is set there is not asked again. 9. Ask for a credential that is not provided in `.env` (`GITEA_TOKEN`, `GITHUB_PAT`, `GITHUB_USER`) and, when the Maintainer agrees, create a `.env` file with the credentials the new project needs. 10. Let the Maintainer set the project's license in `config.env` (`PROJECT_LICENSE`), independent of the GitHub choice, or set `none` for no license. +11. Let the Maintainer start the script by name from the folder where the project is to be created, through a command link in a folder on `PATH`. ## Scope @@ -51,12 +52,14 @@ One repeatable, reviewed procedure gives every new project the same secure basel - `create-project.sh`, `config.env.example`, `.env.example`, `.gitignore` and `README.md`. - Safe parsing and validation of `config.env` and `.env` (never `source`d). -- Prompts for name, description, visibility and owner on each chosen host, and whether to use GitHub (which also applies the AGPL license). Each of these details may be set in `config.env` instead and is then not asked. +- Prompts for name, description, visibility and owner on each chosen host, and whether to use GitHub (which also applies the AGPL license when the project is public). Each of these details may be set in `config.env` instead and is then not asked. - Checks for required tools (`git`, `curl`, optional `jq`) before any change. - A check that the project name is not already taken on GitHub. - Asking for a credential that `.env` does not provide, and creating the new project's own `.env` (owner-only, ignored by git, never overwritten without a yes). - A project license set in `config.env` (`PROJECT_LICENSE`, optional, never asked), checked against the licenses the Gitea server offers. - Partial-failure reporting with a documented way to continue. +- Starting through a command link: the script finds its own files from the link, and the new project lands in the folder it was started in. +- Fetching the framework's own submodules (`git submodule update --init --recursive`), so the `qc` checklists are present. - Documentation of the SSH prerequisite for the submodule (Gitea SSH on port `10022`). ### Out of Scope @@ -97,7 +100,8 @@ Supports developing on self-hosted Gitea while publishing to GitHub, and adoptin | 7 | Documentation | `README.md` covers installation, configuration, usage, security decisions, error handling and stakeholders | Review by S02 against MIL-003 Go/No-Go criterion 6 | | 8 | Preset details | A project detail set in `config.env` is never asked; an invalid one stops the run before any request and names the key | Tests with each key set, absent, empty and invalid | | 9 | Credentials asked and kept | A credential missing from `.env` is asked (not echoed) instead of stopping the run; the new project's `.env` is created only after a yes, owner-only, ignored by git, holding only the keys the project needs, and an existing `.env` is never replaced without a yes | Tests: each credential present and missing, `.env` written, declined, existing, file mode, git exclusion, no token in output | -| 10 | Project license | `PROJECT_LICENSE` set: that license is on the Gitea repository with and without GitHub; `none`: no license; absent: AGPL-3.0 only when GitHub is chosen; a license the server does not offer stops the run before anything is created | Tests with a license set, `none`, absent and not offered | +| 10 | Project license | `PROJECT_LICENSE` set: that license is on the Gitea repository with and without GitHub; `none`: no license; absent: AGPL-3.0 only when GitHub is chosen and the project is public; a license the server does not offer stops the run before anything is created | Tests with a license set, `none`, absent and not offered | +| 11 | Global command | Started through a command link in a `PATH` folder from another folder, the script runs, reads the checkout's `config.env` and `.env` and creates the project under that folder | Test run through a link; the README example run once | ## Risks @@ -149,5 +153,3 @@ Proceed — the procedure is small, well bounded and removes a repeated, securit [SA-001]: ./stakeholder-analysis.md [UCD-001]: ./use-case-diagram.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b -[d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/dcd.md b/docs/dcd.md index 6aaef67..7d693b4 100644 --- a/docs/dcd.md +++ b/docs/dcd.md @@ -4,13 +4,13 @@ | Key | Value | | --- | --- | | ID | DCD-002 | -| CrossReference | [DCD-001], [DM-002], [UC-001], [OC-001], [SD-001], [DICT-001] | +| CrossReference | [DCD-001], [DCD-003], [DM-002], [UC-001], [UC-002], [OC-001], [SD-001], [SD-002], [DICT-001] | ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Added CredentialCollector, EnvFileWriter and EnvFile (from DCD-001) | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | ProjectRequest carries the license that applies (from DCD-001) | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Launcher, Checkout and WorkingFolder; startProjectCreation takes the checkout and working folder (from DCD-003, UC-002) | pending | --- @@ -33,7 +33,7 @@ enum Visibility { } class ProjectCreator <> { - +startProjectCreation() : PromptSet + +startProjectCreation(checkout : Checkout, workingFolder : WorkingFolder, configPath : Path [0..1], envPath : Path [0..1]) : PromptSet +provideProjectDetails(name : String, description : String, visibility : Visibility, giteaOwner : Owner, githubOwner : Owner [0..1], directory : Path, enablePlanGate : Boolean, writeEnvFile : Boolean) : Summary } class ConfigLoader { @@ -80,6 +80,19 @@ class SummaryReport { +compose(request : ProjectRequest) : Summary } +class Launcher { + +resolveCheckout(invocation : Path) : Checkout + +currentFolder() : WorkingFolder + +startFromWorkingFolder(configPath : Path [0..1], envPath : Path [0..1]) : PromptSet +} +class Checkout { + -path : Path + +configFile() : Path + +envFile() : Path +} +class WorkingFolder { + -path : Path +} class Run { -isApply : Boolean } @@ -170,6 +183,11 @@ class Summary { -nextSteps : String [0..*] } +Launcher "1" --> "1" ProjectCreator : starts +Launcher ..> Checkout : creates +Launcher ..> WorkingFolder : creates +Run "1" *-- "1" Checkout +Run "1" *-- "1" WorkingFolder ProjectCreator ..> ConfigLoader : creates ProjectCreator ..> ToolChecker : creates ProjectCreator ..> CredentialCollector : creates @@ -231,6 +249,9 @@ Repository "0..*" --> "1" Visibility | Class | Refines (Domain Model concept) | Responsibility | Attributes | Operations | | --- | --- | --- | --- | --- | +| `Launcher` | Command Link (the object that follows it) | Follows the command link to the checkout, takes the folder the Maintainer stands in, and starts the run. | none | `resolveCheckout`, `currentFolder`, `startFromWorkingFolder` | +| `Checkout` | Checkout | Names the folder that holds the script's own files and the default `config.env` and `.env`. | `path` | `configFile`, `envFile` | +| `WorkingFolder` | Working Folder | Names the base of the default directory of the new project. | `path` | none | | `ProjectCreator` | none (controller for the system operations of [OC-001]) | Receives the two system operations, sequences the steps and stops on the first failure. | none | `startProjectCreation`, `provideProjectDetails` | | `ConfigLoader` | Configuration | Reads `config.env` and `.env` as plain text and validates every value, preset project details included. | none | `load` | | `CredentialCollector` | none (system concept) | Asks, without echo, for a credential that `.env` does not provide and validates it like one read from `.env`. | none | `collect` | @@ -270,7 +291,9 @@ Repository "0..*" --> "1" Visibility | Method signature | Operation Contract / SD message | | --- | --- | -| `ProjectCreator.startProjectCreation() : PromptSet` | [OC-001] `startProjectCreation`; [SD-001] `startProjectCreation()` | +| `ProjectCreator.startProjectCreation(checkout, workingFolder, configPath, envPath) : PromptSet` | [OC-001] `startProjectCreation`; [SD-001] `startProjectCreation()`; [SD-002] `startProjectCreation(checkout, workingFolder, ...)` | +| `Launcher.startFromWorkingFolder(configPath, envPath) : PromptSet` | [OC-002] `startFromWorkingFolder`; [SD-002] | +| `Launcher.resolveCheckout(invocation) : Checkout`, `Launcher.currentFolder() : WorkingFolder` | [OC-002] P2, P3; [SD-002] | | `ProjectCreator.provideProjectDetails(name, description, visibility, giteaOwner, githubOwner, directory, enablePlanGate, writeEnvFile) : Summary` | [OC-001] `provideProjectDetails`; [SD-001] `provideProjectDetails(...)` | | `ConfigLoader.load(configFile, envFile) : Configuration` | [SD-001] `load(config.env, .env)`; [OC-001] `startProjectCreation` P2 | | `CredentialCollector.collect(configuration, kinds) : Configuration` | [SD-001] `collect(configuration, GITEA_TOKEN)` and `collect(configuration, GITHUB_PAT, GITHUB_USER)`; [OC-001] `startProjectCreation` P2 and the precondition of `provideProjectDetails` | @@ -312,6 +335,7 @@ SOLID check: no class has more than one reason to change (one host API, one kind | Design class | Where it lives in `src/` | | --- | --- | +| `Launcher` | `create-project.sh` (the start of `main`: where the script finds its own folder) | | `ProjectCreator` | `create-project.sh` (`main`), `lib/apply.sh` | | `ConfigLoader` | `lib/config.sh` (`load_configuration`), `lib/validate.sh` | | `ToolChecker` | `lib/tools.sh` | @@ -328,11 +352,14 @@ SOLID check: no class has more than one reason to change (one host API, one kind --- [DCD-001]: ./uc-001/dcd.md +[DCD-003]: ./uc-002/dcd.md +[UC-002]: ./uc-002/uc.md +[SD-002]: ./uc-002/sd.md +[OC-002]: ./uc-002/oc.md [DM-002]: ./domain-model.md [UC-001]: ./uc-001/uc.md [OC-001]: ./uc-001/oc.md [SD-001]: ./uc-001/sd.md [MIL-005]: ./milestones/mil-005-credentials.md [DICT-001]: ./dictionary.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/dictionary.md b/docs/dictionary.md index a4e1127..4f13de1 100644 --- a/docs/dictionary.md +++ b/docs/dictionary.md @@ -4,13 +4,13 @@ | Key | Value | | --- | --- | | ID | DICT-001 | -| CrossReference | [BC-001], [SA-001], [DM-001], [DM-002] | +| CrossReference | [BC-001], [SA-001], [DM-001], [DM-002], [DM-003] | ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Added Credentials File / EnvFile | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | LicenseFile definition no longer tied to GitHub | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Command Link, Checkout and Working Folder (DM-003, UC-002) | pending | --- @@ -39,6 +39,9 @@ Maps each Product Owner (PO) term to its professional IT term. PO language: Engl | Framework Setup | en | HookSetup | The skills and git hooks installed from the framework, with the plan gate on or off. | DM, UC | OC, SD, DCD | | Template | en | Template | A framework file copied into a project. | DM, UC | OC, SD, DCD | | Credentials File | en | EnvFile | The file in the local project that holds a copy of the credentials the project needs; owner-only and ignored by git. | DM, UC | OC, SD, DCD | +| Command Link | en | CommandLink | A name on the shell's search path that leads to the script; made by the Maintainer, only followed by the system (no design class). | DM, UC | OC, SD, DCD | +| Checkout | en | Checkout | The folder that holds RepoFoundry and its default `config.env` and `.env`. | DM, UC | OC, SD, DCD | +| Working Folder | en | WorkingFolder | The folder the Maintainer starts the script in; the base of the default project directory. | DM, UC | OC, SD, DCD | | Summary | en | Summary | The report of what was created, skipped or failed and how to continue. | DM, UC | OC, SD, DCD | ## Rules @@ -58,10 +61,10 @@ Maps each Product Owner (PO) term to its professional IT term. PO language: Engl --- [BC-001]: ./business-case.md +[DM-003]: ./uc-002/dm.md [SA-001]: ./stakeholder-analysis.md [DM-001]: ./uc-001/dm.md [DM-002]: ./domain-model.md [OC-001]: ./uc-001/oc.md [DCD-001]: ./uc-001/dcd.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/domain-model.md b/docs/domain-model.md index d35f7f5..22a941c 100644 --- a/docs/domain-model.md +++ b/docs/domain-model.md @@ -9,14 +9,14 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Added Credentials File (from DM-001, UC-001 step 9) | [ded26a6] | -| 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | License applies when configured, not only when GitHub is chosen (from DM-001) | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License: the AGPL-3.0 default needs GitHub and a public project | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Command Link, Checkout and Working Folder (from DM-003, UC-002) | pending | --- ## Purpose and Scope -The consolidated model of the project. Use-case models are scoped views; when one changes, this model is checked and updated in the same change. It currently covers [UC-001] "Create a new project" ([DM-001]), which it was created from. Concept names are the PO terms recorded in [DICT-001]. +The consolidated model of the project. Use-case models are scoped views; when one changes, this model is checked and updated in the same change. It currently covers [UC-001] "Create a new project" ([DM-001]), which it was created from, and [UC-002] "Start the script as a global command" ([DM-003]). Concept names are the PO terms recorded in [DICT-001]. ## Diagram @@ -82,6 +82,16 @@ class Template { class "Credentials File" as CredentialsFile { address } +class "Command Link" as CommandLink { + name + folder +} +class Checkout { + path +} +class "Working Folder" as WorkingFolder { + path +} class Summary { created items skipped items @@ -114,6 +124,11 @@ LocalProject "1" --> "0..*" Template : contains a copy of LocalProject "1" --> "0..1" CredentialsFile : has CredentialsFile "1" --> "1..2" AccessToken : holds a copy of Summary "1" --> "1" Project : reports on +Maintainer "1" --> "0..*" CommandLink : makes +CommandLink "0..*" --> "1" Checkout : leads to +Maintainer "1" --> "1" WorkingFolder : starts the script in +Checkout "1" --> "1" Configuration : holds by default +WorkingFolder "1" --> "0..*" LocalProject : is the base of @enduml ``` @@ -130,7 +145,7 @@ Summary "1" --> "1" Project : reports on | Repository | A place on a Git Host that holds a project's history | name, description, visibility, address | [UC-001] steps 5 and 6 "repository" | | Gitea Repository | The Repository on Gitea; the source of truth | none beyond Repository | [UC-001] step 6 | | GitHub Repository | The Repository on GitHub; receives its content from the Mirror | none beyond Repository | [UC-001] step 5 | -| License | The legal terms file added to a Gitea Repository when a license applies: the one set in the Configuration, or AGPL-3.0 when GitHub is chosen and none is set | name | [UC-001] step 6 "license" | +| License | The legal terms file added to a Gitea Repository when a license applies: the one set in the Configuration, or AGPL-3.0 when GitHub is chosen, the project is public and none is set | name | [UC-001] step 6 "license" | | Mirror | The push mirror that copies a Gitea Repository to a GitHub Repository | interval, sync on commit | [UC-001] step 7 "push mirror" | | Local Project | The project directory on the Maintainer's machine | directory | [UC-001] step 8 "local project" | | Remote | A named link from a Local Project to a Repository (`origin`, `github`) | name, address | [UC-001] step 8 "remote" | @@ -138,6 +153,9 @@ Summary "1" --> "1" Project : reports on | Framework Setup | The skills and git hooks installed from the Framework, with the plan gate on or off | plan gate enabled | [UC-001] step 9 "skills and hooks", "plan gate" | | Template | A file the Framework provides to copy into a project (`AGENTS.md`, artifact registry) | name | [UC-001] step 9 "templates" | | Credentials File | The file in a Local Project that holds a copy of the Access Tokens (and the GitHub account name) the project needs; readable by its owner only and ignored by git | address | [UC-001] step 9 "credentials file" | +| Command Link | A name in a folder on the shell's search path that leads to the script in the Checkout | name, folder | [UC-002] step 1 "command link" | +| Checkout | The folder that holds RepoFoundry: the script, its own files and by default `config.env` and `.env` | path | [UC-002] step 4 "checkout" | +| Working Folder | The folder in which the Maintainer starts the script and under which the new project is created by default | path | [UC-002] step 2 "working folder" | | Summary | The report of what was created, skipped or failed and how to continue | created items, skipped items, next steps | [UC-001] step 10 "summary" | ## Association Table @@ -167,6 +185,11 @@ Summary "1" --> "1" Project : reports on | Local Project | has | Credentials File | 1 to 0..1 | | Credentials File | holds a copy of | Access Token | 1 to 1..2 | | Summary | reports on | Project | 1 to 1 | +| Maintainer | makes | Command Link | 1 to 0..* | +| Command Link | leads to | Checkout | 0..* to 1 | +| Maintainer | starts the script in | Working Folder | 1 to 1 | +| Checkout | holds by default | Configuration | 1 to 1 | +| Working Folder | is the base of | Local Project | 1 to 0..* | ## Generalizations @@ -177,8 +200,8 @@ Summary "1" --> "1" Project : reports on --- [UC-001]: ./uc-001/uc.md +[UC-002]: ./uc-002/uc.md +[DM-003]: ./uc-002/dm.md [SSD-001]: ./uc-001/ssd.md [DICT-001]: ./dictionary.md [DM-001]: ./uc-001/dm.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b -[d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/milestones/mil-006-project-license.md b/docs/milestones/mil-006-project-license.md index 2ad45dd..7b0e1b4 100644 --- a/docs/milestones/mil-006-project-license.md +++ b/docs/milestones/mil-006-project-license.md @@ -10,12 +10,13 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | AGPL-3.0 default only when GitHub is chosen and the project is public (purpose, resolution order, criterion 3, tasks 1 and 4) | pending | --- ## Purpose -Decide whether the project's license can be set in `config.env` without weakening the existing behaviour: a license that is set applies with or without GitHub, `none` means no license, an absent key keeps today's rule (AGPL-3.0 only when GitHub is chosen), and a license the Gitea server does not offer stops the run before anything is created. +Decide whether the project's license can be set in `config.env` without weakening the existing behaviour: a license that is set applies with or without GitHub, `none` means no license, an absent key gives AGPL-3.0 only when GitHub is chosen and the project is public, and a license the Gitea server does not offer stops the run before anything is created. ## Deliverable @@ -27,7 +28,7 @@ The key (present counts as set, as for the other project details of [MIL-004]; a | --- | --- | --- | | `PROJECT_LICENSE` | the license of the project | a Gitea license key (letters, digits, `.`, `+`, `-`, at most 64 characters), such as `AGPL-3.0` or `MIT`, or `none` | -The license that applies is resolved in this order: `PROJECT_LICENSE` when set (`none` means no license), otherwise AGPL-3.0 when GitHub is chosen, otherwise none. It is never asked: the key is an optional project detail in `config.env`, not a prompt. +The license that applies is resolved in this order: `PROJECT_LICENSE` when set (`none` means no license), otherwise AGPL-3.0 when GitHub is chosen and the project is public, otherwise none. A private project with GitHub therefore gets no license by default. It is never asked: the key is an optional project detail in `config.env`, not a prompt. ## Go / No-Go Criteria @@ -35,7 +36,7 @@ The license that applies is resolved in this order: `PROJECT_LICENSE` when set ( | --- | --- | --- | --- | | 1 | With `PROJECT_LICENSE` set to a license the server offers, the Gitea repository is created with that license, with GitHub and without it, and the plan and summary show it as coming from `config.env` | Tests pass | Another license, none, or no marker | | 2 | `PROJECT_LICENSE=none`: the Gitea repository has no license, also when GitHub is chosen | Tests pass | Any license applied | -| 3 | `PROJECT_LICENSE` absent: AGPL-3.0 when GitHub is chosen and none otherwise, exactly as before; the existing tests pass unchanged | Tests pass | Any change of behaviour | +| 3 | `PROJECT_LICENSE` absent: AGPL-3.0 when GitHub is chosen and the project is public; none for a private project with GitHub, and none without GitHub; the plan and summary say which rule applied | Tests pass | AGPL-3.0 on a private project, or no AGPL-3.0 on a public project with GitHub | | 4 | An empty or invalid value stops the run before any request to a host, names the key and never falls back to asking | Tests pass | A request made or a prompt shown | | 5 | A license the Gitea server does not offer stops the run before anything is created and names the license | Tests pass | Anything created | | 6 | The license is never asked, with the key set, absent or invalid | Tests pass | Any prompt for it | @@ -71,10 +72,10 @@ The license that applies is resolved in this order: `PROJECT_LICENSE` when set ( | # | Task | Summary | Needs its own Use Case/User Story? | Reference | | --- | --- | --- | --- | --- | -| 1 | Read and validate `PROJECT_LICENSE` | Add the key to the `config.env` parser and its validator (a license key or `none`; empty refused; errors name the key). Resolve the license that applies into the project request (key set, else AGPL-3.0 with GitHub, else none) and mark it `(from config.env)` in the summary. Never asked. Extensions of step 3 of [UC-001]. | Yes | [UC-001] | +| 1 | Read and validate `PROJECT_LICENSE` | Add the key to the `config.env` parser and its validator (a license key or `none`; empty refused; errors name the key). Resolve the license that applies into the project request (key set, else AGPL-3.0 with GitHub and a public project, else none) and mark it `(from config.env)` in the summary. Never asked. Extensions of step 3 of [UC-001]. | Yes | [UC-001] | | 2 | Apply the license on Gitea, independent of GitHub | Generalize the preflight check from the fixed AGPL-3.0 to the license that applies (checked only when one applies); create the repository with it; the plan, the summary and the reuse warning name the license that applies instead of AGPL-3.0; GitHub receives the file through the mirror as before. Extension 4c and step 6 of [UC-001]. | Yes | [UC-001] | | 3 | Document the key | Commented example in `config.env.example`, a row in the README table of project details, and the rule for the license that applies, including `none` and the default. | No | | -| 4 | Test every case | Key set (with and without GitHub), `none`, absent, empty, invalid and not offered by the server; never asked; the summary marker; the existing tests unchanged. | No | | +| 4 | Test every case | Key set (with and without GitHub), `none`, absent (public and private, with and without GitHub), empty, invalid and not offered by the server; never asked; the summary marker; the existing tests changed only where a private project with GitHub no longer gets AGPL-3.0. | No | | --- diff --git a/docs/milestones/mil-007-framework-checklists.md b/docs/milestones/mil-007-framework-checklists.md new file mode 100644 index 0000000..78a35c5 --- /dev/null +++ b/docs/milestones/mil-007-framework-checklists.md @@ -0,0 +1,81 @@ +# MIL-007 Framework Checklists and Usage + +## Metadata +| Key | Value | +| --- | --- | +| ID | MIL-007 | +| CrossReference | [BC-001], [US-001], [UC-001], [UC-002] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added UC-002 and US-002 (global command); tasks 2 and 3 trace to UC-002 | pending | + +--- + +## Purpose + +Decide whether a new project holds the whole framework, including the `qc` checklists that the framework keeps in its own submodule, and whether a Maintainer can start the script from the folder where the project is to be created, through a global command, with the README saying exactly how. + +## Deliverable + +1. `create-project.sh` that, after adding the `framework` submodule (and when `framework` already exists as that submodule), runs `git submodule update --init --recursive` in the new project, so `framework/qc/` holds the checklists. +2. `create-project.sh` that finds its own files when started through a symlink, so a link in a folder on `PATH` works from any directory. +3. A README usage section that says: run the script from the folder in which the project is to be created (the default directory is `./` relative to where it is started), keep `config.env` and `.env` in the checkout and point to them with `--config` and `--env` or place them where the script reads them, and make the script global with a worked example (a symlink in a `PATH` folder, with the check that it works), for Linux, macOS and Git Bash on Windows. + +## Go / No-Go Criteria + +| # | Criterion (objectively checkable) | Go | No-Go | +| --- | --- | --- | --- | +| 1 | After a run, `framework/qc/` in the new project holds the checklist files and `git submodule status --recursive` shows no entry starting with `-` | Tests pass | An empty `qc` | +| 2 | A second run on a project whose `qc` is empty fills it and changes nothing else; on a complete project it changes nothing | Tests pass | Anything else changed | +| 3 | A failed nested fetch stops the step, reports what exists, names `git submodule update --init --recursive` as the command to run by hand and shows no credential | Tests pass | A credential shown, or the failure not reported | +| 4 | A framework without a submodule of its own does not make the step fail | Tests pass | Step fails | +| 5 | Started through a symlink in another folder, `create-project.sh --help` works and a run creates the project under the current folder | Tests pass | Files not found, or the project created elsewhere | +| 6 | The README example for the global command was run once as written and its check passed | Verified | An example that was not run | +| 7 | The README states the folder to start from and where the new project lands, with an example from a folder that is not the checkout | Reviewed by S02 | Missing or unclear | +| 8 | All acceptance criteria of US-001.07 and US-002 in [US-001] are met | Verified | Any unmet | + +## Dependencies + +| Depends on | Reason | +| --- | --- | +| [MIL-003] | The framework step and the README already exist | + +## Traceability + +| Business Case objective / KPI / user story | Reference | +| --- | --- | +| User stories US-001.07 and US-002 | [US-001] | +| Objective 5 (the framework submodule) | [BC-001] | +| Objective 11 (global command) and success criterion 11 | [BC-001] | +| Objective 7 (documentation) | [BC-001] | + +## Ownership + +| Role | Stakeholder ID (SA) | +| --- | --- | +| Owner | S01 | +| Approving reviewer | S02 | + +## Target Date + +2026-12-11 — proposed; the Business Case sets no deadline. + +## Tasks + +| # | Task | Summary | Needs its own Use Case/User Story? | Reference | +| --- | --- | --- | --- | --- | +| 1 | Fetch the framework's own submodules | After `git submodule add` of the framework, and on the "already a submodule" path, run `git submodule update --init --recursive` in the new project. A failure stops the step, reports what exists and names the command to run by hand, without a credential. Step 9 and extension 9e of [UC-001]. | Yes | [UC-001] | +| 2 | Start through a command link | Resolve `BASH_SOURCE` through links (without requiring `readlink -f`, which macOS lacks) so `SCRIPT_DIR` and `PROJECT_ROOT` point into the checkout, and keep the current folder as the base of the default directory. Errors name the folder or path looked in. Steps 3 to 6 and extensions 4a and 4b of [UC-002]. | Yes | [UC-002] | +| 3 | Document the usage | Step 1 and extensions 1a and 3a of [UC-002]. README usage section: start from the folder where the project is to be created, where `config.env` and `.env` are read from, `--config` and `--env`, and the global command with a worked example and its check, for Linux, macOS and Git Bash on Windows. | Yes | [UC-002] | +| 4 | Test every case | `qc` filled after a run and after a rerun, nested fetch failure, framework without a submodule, start through a symlink from another folder. | No | | + +--- + +[BC-001]: ../business-case.md +[US-001]: ../user-stories.md +[UC-001]: ../uc-001/uc.md +[UC-002]: ../uc-002/uc.md +[MIL-003]: ./mil-003-scaffold-and-release.md diff --git a/docs/project-plan.md b/docs/project-plan.md index 3a6eb77..a17fe8c 100644 --- a/docs/project-plan.md +++ b/docs/project-plan.md @@ -4,23 +4,23 @@ | Key | Value | | --- | --- | | ID | PP-001 | -| CrossReference | [BC-001], [SA-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [US-001] | +| CrossReference | [BC-001], [SA-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [MIL-007], [US-001] | ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Added phase MIL-005 (proposed dates 2026-11-23 to 2026-11-27) | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Added phase MIL-006 (proposed dates 2026-11-30 to 2026-12-04) | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added phase MIL-007 (proposed dates 2026-12-07 to 2026-12-11); MIL-006 deliverable names the public-only AGPL-3.0 default | pending | --- ## Purpose -Schedule the six phases that deliver RepoFoundry (`create-project.sh` and its documentation) in dependency order. The Business Case sets no deadline, so the dates below are proposals for S01 to confirm. +Schedule the seven phases that deliver RepoFoundry (`create-project.sh` and its documentation) in dependency order. The Business Case sets no deadline, so the dates below are proposals for S01 to confirm. ## Planning Assumptions -- Week 1 starts 2026-10-05; the plan ends by 2026-12-04 (the last phase is proposed). +- Week 1 starts 2026-10-05; the plan ends by 2026-12-11 (the last two phases are proposed). - Phase length: two weeks. - S01 and S02 review each phase through a pull request, as described in [SA-001]. For now one person holds both roles. - The PO language is English, so no translated copies are kept. @@ -34,7 +34,8 @@ Schedule the six phases that deliver RepoFoundry (`create-project.sh` and its do | Scaffold and Release | [MIL-003] | 2026-11-02 to 2026-11-13 | 2026-11-13 | S01 | US-001.03 | Local project, framework, README, final review | [Milestone 45] | | Configurable Details | [MIL-004] | 2026-11-16 to 2026-11-20 | 2026-11-20 | S01 | US-001.04 | Project details preset in config.env | | | Credentials | [MIL-005] | 2026-11-23 to 2026-11-27 | 2026-11-27 | S01 | US-001.05 | Missing credentials asked; project .env | | -| Project License | [MIL-006] | 2026-11-30 to 2026-12-04 | 2026-12-04 | S01 | US-001.06 | PROJECT_LICENSE in config.env | | +| Project License | [MIL-006] | 2026-11-30 to 2026-12-04 | 2026-12-04 | S01 | US-001.06 | PROJECT_LICENSE in config.env; AGPL-3.0 default only for a public GitHub project | | +| Framework Checklists and Usage | [MIL-007] | 2026-12-07 to 2026-12-11 | 2026-12-11 | S01 | US-001.07 | qc fetched with the framework; global command; README usage | | ```plantuml @startgantt @@ -51,6 +52,8 @@ Project starts 2026-10-05 [Credentials Go/No-Go] happens 2026-11-27 [Project License] starts 2026-11-30 and ends 2026-12-04 [Project License Go/No-Go] happens 2026-12-04 +[Framework Checklists and Usage] starts 2026-12-07 and ends 2026-12-11 +[Framework Checklists and Usage Go/No-Go] happens 2026-12-11 @endgantt ``` @@ -67,11 +70,13 @@ Project starts 2026-10-05 | Project details set in `config.env` instead of asked | [MIL-004] | | Missing credentials asked; the new project's `.env` | [MIL-005] | | Project license set in `config.env` | [MIL-006] | +| Framework's own submodules fetched | [MIL-007] | +| README usage from the target folder and as a global command | [MIL-007] | ## Dependencies ``` -MIL-001 → MIL-002 → MIL-003 → MIL-004 → MIL-005 → MIL-006 +MIL-001 → MIL-002 → MIL-003 → MIL-004 → MIL-005 → MIL-006 → MIL-007 ``` A No-Go moves every later date by the time needed to rework the failed criteria. @@ -101,11 +106,11 @@ A No-Go moves every later date by the time needed to rework the failed criteria. [MIL-004]: ./milestones/mil-004-configurable-details.md [MIL-005]: ./milestones/mil-005-credentials.md [MIL-006]: ./milestones/mil-006-project-license.md +[MIL-007]: ./milestones/mil-007-framework-checklists.md [US-001]: ./user-stories.md [UC-001]: ./uc-001/uc.md [SSD-001]: ./uc-001/ssd.md [Milestone 43]: https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry/milestone/43 [Milestone 44]: https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry/milestone/44 [Milestone 45]: https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry/milestone/45 -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/sqa/reviews/rc-022-mil-007.md b/docs/sqa/reviews/rc-022-mil-007.md new file mode 100644 index 0000000..38cd108 --- /dev/null +++ b/docs/sqa/reviews/rc-022-mil-007.md @@ -0,0 +1,71 @@ +# SQA Review Record: MIL-007 and the planning changes it causes + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-022 | +| CrossReference | [MIL-007], [QC-MIL-001], [MIL-006], [BC-001], [US-001], [UC-002], [PP-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [MIL-007], and the changes it causes in [MIL-006], [BC-001], [US-001], [PP-001] and [TM-001]. The use case and its artifacts are reviewed in [RC-023], [RC-024], [RC-025], [RC-026], [RC-027] and [RC-028]. +- Checklist used: [QC-MIL-001] for [MIL-007]. The other artifacts were changed, not created; their change is checked below. +- Review date: 2026-10-07 + +## Checklist Results (QC-MIL-001) + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | A concrete deliverable is defined for every gate | Pass | The script that fetches the framework's own submodules and starts through a command link, plus the README usage section. | +| 2 | Explicit Go/No-Go criteria are stated for each gate | Pass | Eight criteria, each with an objective Go and No-Go, including every acceptance criterion of US-001.07 and US-002. | +| 3 | Dependencies on other milestones are explicitly mapped | Pass | Depends on [MIL-003] (the framework step and README exist), with the reason. | +| 4 | Each milestone is traceable to a Business Case objective or KPI | Pass | Objectives 5, 7 and 11 and success criterion 11 of [BC-001]; US-001.07 and US-002. | +| 5 | Milestone owner and approving reviewer are identified | Pass | Owner S01, approving reviewer S02. | +| 6 | Milestone has a defined target date consistent with project constraints | Pass | 2026-12-11 matches [PP-001]; the Business Case sets no deadline. A proposal for S01 to confirm. | + +## Change checks on the other artifacts + +| Artifact | Change | Status | Evidence/Notes | +| --- | --- | --- | --- | +| [MIL-006] | AGPL-3.0 default only when GitHub is chosen and the project is public (purpose, order, criterion 3, tasks 1 and 4) | Pass | Criterion 3 is objective in both directions: AGPL-3.0 on a private project is a No-Go, and so is none on a public project with GitHub. Tasks and tests follow. | +| [BC-001] | Objectives 2, 5, 10, 11; scope items; success criteria 10 and 11 | Pass | Objective 2 and criterion 10 name the public-only default; objective 11 and criterion 11 are new and measurable. | +| [US-001] | US-001.06 reworded; US-001.07 and US-002 added; story count updated | Pass | Given/when/then; each traces to its use case and milestone; INVEST exceptions stated. | +| [PP-001] | Phase MIL-007, dependency chain, timeline, scope coverage, end date 2026-12-11 | Pass | Dates agree with [MIL-007]. One point carried over from earlier plans: the assumption "phase length: two weeks" is not true of [MIL-005], [MIL-006] and [MIL-007], which are one week. | +| [TM-001] | Rows for MIL-007 and the UC-002 artifacts | Pass | Upstream and downstream columns agree with the CrossReference of each document. | + +## Overall Verdict + +Go — [MIL-007] meets every mandatory criterion and the changes to the other artifacts are consistent. Drafted by Claude Code for S02 against the checklist; the author and reviewer are the same person for now (as in the earlier records). The verdict takes effect, and the Version History rows of the reviewed documents change to `Accepted`, only when S02 confirms it. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| Say in the plan assumptions that the later phases are one week, not two (or correct the phase length) | S01 | Before [MIL-006] starts | +| Confirm the proposed target date 2026-12-11 | S01 | Before [MIL-007] starts | + +--- + +[MIL-007]: ../../milestones/mil-007-framework-checklists.md +[MIL-006]: ../../milestones/mil-006-project-license.md +[BC-001]: ../../business-case.md +[US-001]: ../../user-stories.md +[UC-002]: ../../uc-002/uc.md +[PP-001]: ../../project-plan.md +[TM-001]: ../traceability-matrix.md +[RC-023]: ./rc-023-uc-002.md +[RC-024]: ./rc-024-ssd-002.md +[RC-025]: ./rc-025-dm-003.md +[RC-026]: ./rc-026-oc-002.md +[RC-027]: ./rc-027-sd-002.md +[RC-028]: ./rc-028-dcd-003.md +[QC-MIL-001]: ../../../framework/qc/qc-milestones-gateways.md +[MIL-003]: ../../milestones/mil-003-scaffold-and-release.md +[MIL-005]: ../../milestones/mil-005-credentials.md diff --git a/docs/sqa/reviews/rc-023-uc-002.md b/docs/sqa/reviews/rc-023-uc-002.md new file mode 100644 index 0000000..ea81b93 --- /dev/null +++ b/docs/sqa/reviews/rc-023-uc-002.md @@ -0,0 +1,62 @@ +# SQA Review Record: UC-002 Start the script as a global command + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-023 | +| CrossReference | [UC-002], [QC-UC-001], [UC-001], [UCD-001], [US-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [UC-002], and the changes it causes in [UC-001] and [UCD-001]. +- Checklist used: [QC-UC-001] (Fully Dressed). +- Review date: 2026-10-07 + +## Checklist Results (QC-UC-001) + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Consists of a single, concise paragraph summarizing only the primary success scenario | N-A | Format is Fully Dressed. | +| 2 | Written as an informal multi-paragraph narrative; may mention some alternate flows without formal structure | N-A | Format is Fully Dressed. | +| 3 | All standard sections are present: actors, preconditions, postconditions, main success scenario, alternative/exception flows | Pass | Actor, stakeholders, preconditions, postconditions, main scenario, extensions, rules and open issues are present. | +| 4 | Preconditions and postconditions are explicitly defined | Pass | Preconditions name the checkout, the config files and a writable `PATH` folder; postconditions name the link, the working folder and that nothing else was written. | +| 5 | Primary actor is explicitly stated | Pass | Primary actor: Maintainer, as in [UCD-001]. | +| 6 | Stakeholders and their interests are stated | Pass | S01, S02 and S03 with their interests. | +| 7 | Main success scenario is written as clear, numbered steps | Pass | Six numbered steps; steps 1 and 2 are the Maintainer's, 3 to 6 the system's. | +| 8 | Alternative/exception flows correctly reference `<>`/`<>` use cases where relevant, per UML 2.5.1 | Pass | Step 5 `<>` [UC-001], and [UCD-001] shows the same relationship. | +| 9 | Explicit business rules are captured per step where applicable, rather than embedded loosely in narrative text | Pass | Five rules, each tied to a step. | +| 10 | Naming of actors and use case title is consistent with the corresponding Use Case Diagram and User Stories | Pass | Title "Start the script as a global command" and actor equal those of [UCD-001] and US-002. | +| 11 | Scope/level (e.g. summary, user-goal, subfunction) is explicitly stated | Pass | Level user-goal and scope are stated. | +| 12 | Use case is written from the actor's goal perspective, free of UI or implementation detail | Pass | Written as the Maintainer's goal. It names `PATH`, `--config` and `--env`, which are the Maintainer's own vocabulary for this system, as in [UC-001]; the rule that named a missing tool was reworded to "on every supported platform" during this review. | + +## Change checks on the other artifacts + +| Artifact | Change | Status | Evidence/Notes | +| --- | --- | --- | --- | +| [UC-001] | Step 6 and rule 6 (public-only AGPL-3.0 default); step 9 and extension 9e (the framework's own submodules) | Pass | Extension 9e stops the step and names the command to run by hand, without a credential; consistent with US-001.07 and MIL-007. | +| [UCD-001] | UC-002 added with `<>` [UC-001] | Pass | Diagram, actor table, use case table and relationship table agree. | + +## Overall Verdict + +Go — [UC-002] meets every mandatory criterion. Drafted by Claude Code for S02 against the checklist; the author and reviewer are the same person for now (as in the earlier records). The verdict takes effect, and the Version History rows of the reviewed documents change to `Accepted`, only when S02 confirms it. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | - | - | + +--- + +[UC-002]: ../../uc-002/uc.md +[UC-001]: ../../uc-001/uc.md +[UCD-001]: ../../use-case-diagram.md +[US-001]: ../../user-stories.md +[QC-UC-001]: ../../../framework/qc/qc-use-case.md diff --git a/docs/sqa/reviews/rc-024-ssd-002.md b/docs/sqa/reviews/rc-024-ssd-002.md new file mode 100644 index 0000000..bd71d48 --- /dev/null +++ b/docs/sqa/reviews/rc-024-ssd-002.md @@ -0,0 +1,49 @@ +# SQA Review Record: SSD-002 Start the script as a global command + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-024 | +| CrossReference | [SSD-002], [QC-SSD-001], [UC-002], [DM-003] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [SSD-002]. +- Checklist used: [QC-SSD-001]. +- Review date: 2026-10-07 + +## Checklist Results (QC-SSD-001) + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Input/output messages match the corresponding Use Case's main success scenario step-for-step | Pass | `startFromWorkingFolder` covers steps 3 to 5 and `provideProjectDetails` steps 5 and 6; steps 1 and 2 are the Maintainer's own and the diagram says so. | +| 2 | Actor and System are treated strictly as black boxes (system shown as `:System`) | Pass | Only `Maintainer` and `:System` appear. | +| 3 | Object creation/destruction of the System instance handled explicitly where relevant | N-A | The system is one script run. | +| 4 | Return values are shown for operations that produce one, using dashed return arrows | Pass | Dashed returns for the prompts and the summary. | +| 5 | Alternate/exceptional flows are represented separately (or explicitly out of scope noted) | Pass | Failure flows are named as out of scope (extensions 1a, 3a, 4a, 4b). Added during this review: the first draft did not say so. | +| 6 | Message names are verb phrases consistent with the use case's system responsibilities | Pass | Both messages are verb phrases. | +| 7 | Diagram references the specific Use Case (name and ID) it depicts | Pass | Names [UC-002] in Source Use Case. | + +## Overall Verdict + +Go — [SSD-002] meets every mandatory criterion after the fix recorded under criterion 5. Drafted by Claude Code for S02 against the checklist; the author and reviewer are the same person for now (as in the earlier records). The verdict takes effect, and the Version History rows of the reviewed documents change to `Accepted`, only when S02 confirms it. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | - | - | + +--- + +[SSD-002]: ../../uc-002/ssd.md +[UC-002]: ../../uc-002/uc.md +[DM-003]: ../../uc-002/dm.md +[QC-SSD-001]: ../../../framework/qc/qc-ssd.md diff --git a/docs/sqa/reviews/rc-025-dm-003.md b/docs/sqa/reviews/rc-025-dm-003.md new file mode 100644 index 0000000..8ba1fd9 --- /dev/null +++ b/docs/sqa/reviews/rc-025-dm-003.md @@ -0,0 +1,73 @@ +# SQA Review Record: DM-003 Start the script as a global command, and the dictionary + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-025 | +| CrossReference | [DM-003], [QC-DM-001], [QC-DICT-001], [DICT-001], [DM-002] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [DM-003], and the changes it causes in [DM-002] and [DICT-001]. +- Checklists used: [QC-DM-001] for [DM-003]; [QC-DICT-001] for [DICT-001]. +- Review date: 2026-10-07 + +## Checklist Results (QC-DM-001) + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Uses ubiquitous/business language throughout; no technical or implementation jargon (e.g. no "table", "class", "pointer") | Pass | Command Link, Checkout and Working Folder are Maintainer terms. "Checkout" is also a git word; it is kept because it names the folder the Maintainer cloned. | +| 2 | Multiplicities on associations are correct and complete (e.g. `1..*`, `0..1`) | Pass | Every association has a multiplicity on both ends. | +| 3 | No operation/method signatures shown — attributes and associations only | Pass | Attributes and associations only. | +| 4 | Associations are named with an unambiguous reading direction | Pass | Every association has a reading direction in the table. | +| 5 | Generalization/specialization used correctly, reflecting true "is-a" relationships, not misused for code reuse | N-A | No generalization. | +| 6 | Every concept traces to a noun phrase found in the use cases or glossary | Pass | Each new concept cites its use case step. The concepts Maintainer, Configuration and Local Project come from [DM-001] and are stated as not redefined. | +| 7 | Attributes are simple domain data (no foreign-key-like references or object pointers modeled as attributes) | Pass | `folder` and `path` are simple data; the links to other concepts are associations. | + +## Checklist Results (QC-DICT-001) + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Every row has a PO term, its language, an IT term and a definition | Pass | Three new rows, each with PO term, language, IT term and definition. | +| 2 | Each PO term maps to exactly one IT term and the reverse (no synonyms) | Pass | One IT term per PO term and the reverse: Command Link / CommandLink, Checkout / Checkout, Working Folder / WorkingFolder. | +| 3 | Every Domain Model concept has a row, and the Domain Model uses its PO term | Pass | Every concept of [DM-003] and of [DM-002] has a row. | +| 4 | The Operation Contracts, Sequence Diagrams, Design Class Diagrams and ERD use the IT term, not the PO term | Pass | [OC-002], [SD-002] and [DCD-003] use the IT terms. `CommandLink` appears in [OC-002] only: it is a link the Maintainer makes, so it has no design class, which the DCD and the dictionary say. | +| 5 | Definitions are written in the PO language and are one sentence | Pass | One-sentence definitions in English, the PO language. | +| 6 | "Used as PO term in" and "Used as IT term in" name artifact types that exist in the project | Pass | Names DM, UC, OC, SD and DCD, which exist. | +| 7 | Translated artifacts (`..md`) use the PO terms of the dictionary | N-A | The PO language is English. | + +## Change checks on the other artifacts + +| Artifact | Change | Status | Evidence/Notes | +| --- | --- | --- | --- | +| [DM-002] | Three concepts and five associations added | Pass | Diagram, concept table and association table changed in the same way as [DM-003]; Purpose names [UC-002]. | + +## Overall Verdict + +Go — [DM-003] and the dictionary meet every mandatory criterion. Drafted by Claude Code for S02 against the checklist; the author and reviewer are the same person for now (as in the earlier records). The verdict takes effect, and the Version History rows of the reviewed documents change to `Accepted`, only when S02 confirms it. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | - | - | + +--- + +[DM-003]: ../../uc-002/dm.md +[DM-002]: ../../domain-model.md +[DM-001]: ../../uc-001/dm.md +[DICT-001]: ../../dictionary.md +[OC-002]: ../../uc-002/oc.md +[SD-002]: ../../uc-002/sd.md +[DCD-003]: ../../uc-002/dcd.md +[QC-DM-001]: ../../../framework/qc/qc-domain-model.md +[QC-DICT-001]: ../../../framework/qc/qc-dictionary.md +[UC-002]: ../../uc-002/uc.md diff --git a/docs/sqa/reviews/rc-026-oc-002.md b/docs/sqa/reviews/rc-026-oc-002.md new file mode 100644 index 0000000..c524eea --- /dev/null +++ b/docs/sqa/reviews/rc-026-oc-002.md @@ -0,0 +1,57 @@ +# SQA Review Record: OC-002 Start the script as a global command, and OC-001 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-026 | +| CrossReference | [OC-002], [QC-OC-001], [OC-001], [SSD-002], [DM-003] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [OC-002], and the changes it causes in [OC-001]. +- Checklist used: [QC-OC-001]. +- Review date: 2026-10-07 + +## Checklist Results (QC-OC-001) + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Method signature is complete: operation name, parameter types, and return type | Pass | `startFromWorkingFolder(configPath: Path [0..1], envPath: Path [0..1]): PromptSet`, as in [SSD-002]. | +| 2 | Preconditions explicitly list required state before execution | Pass | Two preconditions in Domain Model terms (a Command Link or the path, and a Working Folder). | +| 3 | Postconditions explicitly describe resulting state using Larman's "instance created/associated/attribute modified" style | Pass | Six postconditions as created, associated or set. P2 was reworded during this review from "by following the link through every level of links" (a procedure) to "reached through the link, however many links lie between them". | +| 4 | Exceptions and error conditions are documented, including the triggering precondition failure | Pass | Three exceptions, each with its failing precondition and an outcome that changes nothing. | +| 5 | Operation is explicitly traceable to a single SSD message | Pass | One contract for `startFromWorkingFolder`; `provideProjectDetails` is the contract of [OC-001] and the SSD says so. | +| 6 | Contract avoids specifying implementation/algorithmic details (declarative, not procedural) | Pass | Declarative after the P2 rewording. | +| 7 | Cross-references the Domain Model classes/associations affected by pre/postconditions | Pass | The Concepts row and the preamble name the concepts of [DM-003]. | + +## Change checks on the other artifacts + +| Artifact | Change | Status | Evidence/Notes | +| --- | --- | --- | --- | +| [OC-001] | P4: the AGPL-3.0 default needs `githubOwner` and a public `visibility`; P10: the framework's own submodules were initialised; a new exception for a failed fetch | Pass | The exception outcome matches extension 9e of [UC-001] and names the command to run by hand. | + +## Overall Verdict + +Go — [OC-002] meets every mandatory criterion. Drafted by Claude Code for S02 against the checklist; the author and reviewer are the same person for now (as in the earlier records). The verdict takes effect, and the Version History rows of the reviewed documents change to `Accepted`, only when S02 confirms it. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | - | - | + +--- + +[OC-002]: ../../uc-002/oc.md +[OC-001]: ../../uc-001/oc.md +[SSD-002]: ../../uc-002/ssd.md +[DM-003]: ../../uc-002/dm.md +[QC-OC-001]: ../../../framework/qc/qc-operation-contract.md +[UC-001]: ../../uc-001/uc.md diff --git a/docs/sqa/reviews/rc-027-sd-002.md b/docs/sqa/reviews/rc-027-sd-002.md new file mode 100644 index 0000000..da11322 --- /dev/null +++ b/docs/sqa/reviews/rc-027-sd-002.md @@ -0,0 +1,50 @@ +# SQA Review Record: SD-002 Start the script as a global command + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-027 | +| CrossReference | [SD-002], [QC-SD-001], [OC-002], [DCD-003] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [SD-002]. +- Checklist used: [QC-SD-001]. +- Review date: 2026-10-07 + +## Checklist Results (QC-SD-001) + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | Message passing strictly follows UML sync/async/return arrow syntax | Pass | Solid arrows for calls, dashed for returns. | +| 2 | GRASP/GoF patterns applied and explicitly annotated where used (e.g. Controller, Observer, Mediator, Factory) | Pass | Information Expert, Controller and Low Coupling are annotated. | +| 3 | Lifelines show activation bars matching actual processing time/call nesting | Pass | `Launcher` and `ProjectCreator` are activated for the length of their calls. | +| 4 | Object creation and destruction shown with correct UML notation (`create`/`destroy` messages, X on lifeline) | Pass | `create` messages for `Checkout` and `WorkingFolder` were missing in the first draft and were added during this review. | +| 5 | Diagram realizes the postconditions of a specific Operation Contract | Pass | The coverage table maps P1 to P6 to messages. | +| 6 | Responsibility assignment favors low coupling/high cohesion (no god-object receiving all messages) | Pass | `Launcher` only finds the checkout and the working folder; the other work stays with `ProjectCreator`. | +| 7 | Loop, alt, and opt combined fragments used correctly for conditional/repeated behavior | N-A | No loop or option: two `alt` fragments for the exceptions. | +| 8 | Each exception of the realized Operation Contract is shown as an `alt` or `opt` fragment, or its absence is justified | Pass | Both exception groups of [OC-002] are `alt` fragments and the coverage table lists them. | + +## Overall Verdict + +Go — [SD-002] meets every mandatory criterion after the fix recorded under criterion 4. Drafted by Claude Code for S02 against the checklist; the author and reviewer are the same person for now (as in the earlier records). The verdict takes effect, and the Version History rows of the reviewed documents change to `Accepted`, only when S02 confirms it. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| None | - | - | + +--- + +[SD-002]: ../../uc-002/sd.md +[OC-002]: ../../uc-002/oc.md +[DCD-003]: ../../uc-002/dcd.md +[QC-SD-001]: ../../../framework/qc/qc-sequence-diagram.md diff --git a/docs/sqa/reviews/rc-028-dcd-003.md b/docs/sqa/reviews/rc-028-dcd-003.md new file mode 100644 index 0000000..1030fd7 --- /dev/null +++ b/docs/sqa/reviews/rc-028-dcd-003.md @@ -0,0 +1,62 @@ +# SQA Review Record: DCD-003 Start the script as a global command, and DCD-002 + +## Metadata +| Key | Value | +| --- | --- | +| ID | RC-028 | +| CrossReference | [DCD-003], [QC-DCD-001], [DCD-002], [DCD-001], [SD-002] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Artifact Under Review + +- Instance reviewed: [DCD-003], and the changes it causes in [DCD-002]. +- Checklist used: [QC-DCD-001]. +- Review date: 2026-10-07 + +## Checklist Results (QC-DCD-001) + +| # | Criterion | Status | Evidence/Notes | +| --- | --- | --- | --- | +| 1 | SOLID principles applied; no god classes with excessive responsibilities | Pass | Three small classes with one responsibility each; `Launcher` has no data and no logic beyond finding folders. | +| 2 | Visibility markers correct and consistent (`+` public, `-` private, `#` protected) | Pass | `+` for operations, `-` for attributes. | +| 3 | Relationships correctly distinguished: Association vs Aggregation vs Composition vs Dependency | Pass | Composition `Run` to `Checkout` and `WorkingFolder`; dependencies for creation; one association `Launcher` to `ProjectCreator`. | +| 4 | Multiplicities and navigability specified on all associations | Pass | The `Launcher` to `ProjectCreator` association had no multiplicity in the first draft; `"1" --> "1"` was added in [DCD-003] and [DCD-002] during this review. | +| 5 | Applied design patterns are annotated explicitly (e.g. Singleton, Factory, Strategy) | Pass | Controller and Information Expert are annotated. | +| 6 | Method signatures are traceable to Operation Contracts and/or design Sequence Diagrams | Pass | Method Traceability maps every method to [OC-002] or [SD-002]. | +| 7 | Class names and structure remain consistent with the Domain Model concepts they refine | Pass | Launcher refines Command Link, Checkout and Working Folder keep their names; the table says why Command Link has no class of its own. | +| 8 | No circular dependencies between classes/packages unless explicitly justified | Pass | `Launcher` depends on the others and none depends on it. | + +## Change checks on the other artifacts + +| Artifact | Change | Status | Evidence/Notes | +| --- | --- | --- | --- | +| [DCD-002] | `Launcher`, `Checkout`, `WorkingFolder`; `ProjectCreator.startProjectCreation` takes the checkout, the working folder and the two paths | Pass with a note | The signature differs from [DCD-001], [OC-001] and [SD-001], which show `startProjectCreation()` with no parameters. The scoped views of [UC-001] were not changed; [DCD-002] is the consolidated truth and records the new signature and its source in Method Traceability. | + +## Overall Verdict + +Go-with-conditions — [DCD-003] meets every mandatory criterion, but the consolidated [DCD-002] and the scoped views of [UC-001] disagree on the signature of `startProjectCreation`. The status stays `Proposed` until the action item is closed. Drafted by Claude Code for S02 against the checklist; the author and reviewer are the same person for now (as in the earlier records). The verdict takes effect, and the Version History rows of the reviewed documents change to `Accepted`, only when S02 confirms it. + +## Action Items + +| Action | Owner | Due | +| --- | --- | --- | +| Decide whether [OC-001], [SD-001] and [DCD-001] get the new `startProjectCreation` parameters too, or are kept as the scoped view of [UC-001] with a note that [DCD-002] supersedes the signature | S01 | Before [MIL-007] starts | + +--- + +[DCD-003]: ../../uc-002/dcd.md +[DCD-002]: ../../dcd.md +[DCD-001]: ../../uc-001/dcd.md +[OC-001]: ../../uc-001/oc.md +[SD-001]: ../../uc-001/sd.md +[SD-002]: ../../uc-002/sd.md +[UC-001]: ../../uc-001/uc.md +[MIL-007]: ../../milestones/mil-007-framework-checklists.md +[QC-DCD-001]: ../../../framework/qc/qc-dcd.md +[OC-002]: ../../uc-002/oc.md diff --git a/docs/sqa/traceability-matrix.md b/docs/sqa/traceability-matrix.md index 4c8ab85..12e6b69 100644 --- a/docs/sqa/traceability-matrix.md +++ b/docs/sqa/traceability-matrix.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Added MIL-005, RC-020 and RC-021 | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Added MIL-006 | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added MIL-007, UC-002, SSD-002, DM-003, OC-002, SD-002 and DCD-003 with their reviews RC-022 to RC-028 | pending | --- @@ -24,26 +24,33 @@ updated whenever an artifact instance is created or reviewed. | Artifact Instance | Type | Upstream (Backward Link) | Downstream (Forward Link) | Last Reviewed (RC-ID) | | --- | --- | --- | --- | --- | -| [BC-001] | BC | - | [SA-001], [PP-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [US-001], [UCD-001] | [RC-010], [RC-018], [RC-020] | +| [BC-001] | BC | - | [SA-001], [PP-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [MIL-007], [US-001], [UCD-001] | [RC-010], [RC-018], [RC-020], [RC-022] | | [SA-001] | SA | [BC-001] | [UCD-001], [UC-001], [DICT-001] | [RC-013] | -| [PP-001] | PP | [BC-001], [SA-001] | [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006] | [RC-012], [RC-018], [RC-020] | +| [PP-001] | PP | [BC-001], [SA-001] | [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [MIL-007] | [RC-012], [RC-018], [RC-020], [RC-022] | | [MIL-001] | MIL | [BC-001], [PP-001] | [US-001] | [RC-011], [RC-016] | | [MIL-002] | MIL | [BC-001], [PP-001] | [US-001] | [RC-014], [RC-017] | | [MIL-003] | MIL | [BC-001], [PP-001] | [US-001] | [RC-015], [RC-017] | | [MIL-004] | MIL | [BC-001], [PP-001] | [US-001] | [RC-018], [RC-019] | | [MIL-005] | MIL | [BC-001], [PP-001] | [US-001] | [RC-020] | -| [MIL-006] | MIL | [BC-001], [PP-001] | [US-001] | - | -| [UCD-001] | UCD | [BC-001], [SA-001] | [US-001], [UC-001] | [RC-009] | -| [US-001] | US | [BC-001], [UCD-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006] | [UC-001] | [RC-001], [RC-020] | -| [UC-001] | UC | [UCD-001], [US-001], [SA-001] | [SSD-001], [DM-001] | [RC-002], [RC-020] | +| [MIL-006] | MIL | [BC-001], [PP-001] | [US-001] | [RC-022] | +| [MIL-007] | MIL | [BC-001], [PP-001] | [US-001], [UC-002] | [RC-022] | +| [UCD-001] | UCD | [BC-001], [SA-001] | [US-001], [UC-001], [UC-002] | [RC-009], [RC-023] | +| [US-001] | US | [BC-001], [UCD-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [MIL-007] | [UC-001] | [RC-001], [RC-020], [RC-022] | +| [UC-001] | UC | [UCD-001], [US-001], [SA-001] | [SSD-001], [DM-001] | [RC-002], [RC-020], [RC-023] | +| [UC-002] | UC | [UCD-001], [US-001], [SA-001], [BC-001] | [SSD-002], [DM-003] | [RC-023] | +| [SSD-002] | SSD | [UC-002], [DM-003] | [OC-002] | [RC-024] | +| [DM-003] | DM | [UC-002], [UCD-001], [SSD-002], [DICT-001], [DM-001] | [OC-002], [DCD-003] | [RC-025] | +| [OC-002] | OC | [SSD-002], [DM-003] | [SD-002] | [RC-026] | +| [SD-002] | SD | [OC-002], [DCD-003] | [DCD-003] | [RC-027] | +| [DCD-003] | DCD | [DM-003], [SD-002], [DICT-001], [UC-002], [DCD-001] | [DCD-002] | [RC-028] | | [SSD-001] | SSD | [UC-001] | [OC-001] | [RC-003], [RC-020] | | [DM-001] | DM | [UC-001], [SSD-001] | [DM-002], [DICT-001], [OC-001], [DCD-001] | [RC-004], [RC-020] | -| [DM-002] | DM | [DM-001] | [DICT-001], [DCD-001], [DCD-002] | [RC-005], [RC-020] | -| [DICT-001] | DICT | [BC-001], [SA-001], [DM-001], [DM-002] | [OC-001], [SD-001] | [RC-008], [RC-020] | -| [OC-001] | OC | [SSD-001], [DM-001] | [SD-001] | [RC-006], [RC-020] | +| [DM-002] | DM | [DM-001] | [DICT-001], [DCD-001], [DCD-002] | [RC-005], [RC-020], [RC-025] | +| [DICT-001] | DICT | [BC-001], [SA-001], [DM-001], [DM-002] | [OC-001], [SD-001] | [RC-008], [RC-020], [RC-025] | +| [OC-001] | OC | [SSD-001], [DM-001] | [SD-001] | [RC-006], [RC-020], [RC-026] | | [SD-001] | SD | [OC-001] | [DCD-001] | [RC-007], [RC-020], [RC-021] | | [DCD-001] | DCD | [UC-001], [DM-001], [DM-002], [OC-001], [SD-001], [DICT-001] | [DCD-002] | [RC-021] | -| [DCD-002] | DCD | [DCD-001], [DM-002], [DICT-001] | - | [RC-021] | +| [DCD-002] | DCD | [DCD-001], [DCD-003], [DM-002], [DICT-001] | - | [RC-021], [RC-028] | ## Coverage Notes @@ -61,15 +68,29 @@ updated whenever an artifact instance is created or reviewed. [MIL-004]: ../milestones/mil-004-configurable-details.md [MIL-005]: ../milestones/mil-005-credentials.md [MIL-006]: ../milestones/mil-006-project-license.md +[MIL-007]: ../milestones/mil-007-framework-checklists.md [RC-018]: ./reviews/rc-018-mil-004.md [RC-019]: ./reviews/rc-019-mil-004-code.md [RC-020]: ./reviews/rc-020-mil-005.md [RC-021]: ./reviews/rc-021-dcd.md +[RC-022]: ./reviews/rc-022-mil-007.md +[RC-023]: ./reviews/rc-023-uc-002.md +[RC-024]: ./reviews/rc-024-ssd-002.md +[RC-025]: ./reviews/rc-025-dm-003.md +[RC-026]: ./reviews/rc-026-oc-002.md +[RC-027]: ./reviews/rc-027-sd-002.md +[RC-028]: ./reviews/rc-028-dcd-003.md [DCD-001]: ../uc-001/dcd.md [DCD-002]: ../dcd.md [UCD-001]: ../use-case-diagram.md [US-001]: ../user-stories.md [UC-001]: ../uc-001/uc.md +[UC-002]: ../uc-002/uc.md +[SSD-002]: ../uc-002/ssd.md +[DM-003]: ../uc-002/dm.md +[OC-002]: ../uc-002/oc.md +[SD-002]: ../uc-002/sd.md +[DCD-003]: ../uc-002/dcd.md [SSD-001]: ../uc-001/ssd.md [DM-001]: ../uc-001/dm.md [DM-002]: ../domain-model.md @@ -93,5 +114,4 @@ updated whenever an artifact instance is created or reviewed. [RC-015]: ./reviews/rc-015-mil-003.md [RC-016]: ./reviews/rc-016-create-project-sh.md [RC-017]: ./reviews/rc-017-e2e-security-review.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/uc-001/dm.md b/docs/uc-001/dm.md index d97a782..1fad4ac 100644 --- a/docs/uc-001/dm.md +++ b/docs/uc-001/dm.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Added Credentials File (a Local Project may have one) | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | License applies when configured, not only when GitHub is chosen | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License: the AGPL-3.0 default needs GitHub and a public project | pending | --- @@ -130,7 +130,7 @@ Summary "1" --> "1" Project : reports on | Repository | A place on a Git Host that holds a project's history | name, description, visibility, address | [UC-001] steps 5 and 6 "repository" | | Gitea Repository | The Repository on Gitea; the source of truth | none beyond Repository | [UC-001] step 6 | | GitHub Repository | The Repository on GitHub; receives its content from the Mirror | none beyond Repository | [UC-001] step 5 | -| License | The legal terms file added to a Gitea Repository when a license applies: the one set in the Configuration, or AGPL-3.0 when GitHub is chosen and none is set | name | [UC-001] step 6 "license" | +| License | The legal terms file added to a Gitea Repository when a license applies: the one set in the Configuration, or AGPL-3.0 when GitHub is chosen, the project is public and none is set | name | [UC-001] step 6 "license" | | Mirror | The push mirror that copies a Gitea Repository to a GitHub Repository | interval, sync on commit | [UC-001] step 7 "push mirror" | | Local Project | The project directory on the Maintainer's machine | directory | [UC-001] step 8 "local project" | | Remote | A named link from a Local Project to a Repository (`origin`, `github`) | name, address | [UC-001] step 8 "remote" | @@ -180,5 +180,4 @@ Summary "1" --> "1" Project : reports on [SSD-001]: ./ssd.md [DICT-001]: ../dictionary.md [DM-002]: ../domain-model.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/uc-001/oc.md b/docs/uc-001/oc.md index 86f4152..d403e03 100644 --- a/docs/uc-001/oc.md +++ b/docs/uc-001/oc.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Credentials asked when missing; EnvFile created in the local project (P14); writeEnvFile parameter | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | P2, P4 and an exception: the license that applies, not always AGPL-3.0 | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | P4: the AGPL-3.0 default needs githubOwner and a public visibility; P10: the framework's own submodules were initialised, with an exception for a failed fetch | pending | --- @@ -64,13 +64,13 @@ Concepts below use the IT terms of [DICT-001] for the PO concepts of [DM-001]. ` - P1. A `ProjectRequest` instance was created with the attributes given by the Maintainer or defined by the `Configuration`, and associated with the `Run`. - P2. A `PreflightResult` instance was created and associated with the `ProjectRequest`, recording that each token needed for the chosen hosts works, that each owner accepts new repositories, that the name is free on the chosen hosts, that the license that applies is offered by Gitea (when a license applies), and the outcome of the SSH test to Gitea on port 10022. - P3. A `GiteaRepository` instance was created under `giteaOwner` with the given name, description and visibility, and associated with the `ProjectRequest`. -- P4. If a license applies, a `LicenseFile` instance for it was created and associated with the `GiteaRepository`, so that repository is not empty. The license that applies is the one the `Configuration` defines (`PROJECT_LICENSE`; `none` means none), otherwise `AGPL-3.0` if `githubOwner` is present, otherwise none. If no license applies the `GiteaRepository` has no `LicenseFile` and is empty. +- P4. If a license applies, a `LicenseFile` instance for it was created and associated with the `GiteaRepository`, so that repository is not empty. The license that applies is the one the `Configuration` defines (`PROJECT_LICENSE`; `none` means none), otherwise `AGPL-3.0` if `githubOwner` is present and `visibility` is `public`, otherwise none. If no license applies the `GiteaRepository` has no `LicenseFile` and is empty. - P5. If `githubOwner` is present, an empty `GitHubRepository` instance was created under `githubOwner` and associated with the `ProjectRequest`. - P6. If `githubOwner` is present, a `PushMirror` instance was created, associated with the `GiteaRepository` as source and the `GitHubRepository` as target, with its effective sync setting recorded, and a first sync was requested. - P7. A `LocalProject` instance was created at `directory`, associated with the `ProjectRequest`. If the `GiteaRepository` is not empty, the `LocalProject` holds its history, including the `LicenseFile` commit. - P8. A `Remote` named `origin` was associated with the `LocalProject`, pointing at the `GiteaRepository` over SSH if the SSH test passed, otherwise over HTTPS, with no credential in its URL. - P9. If `githubOwner` is present, a `Remote` named `github` was associated with the `LocalProject`, pointing at the `GitHubRepository`, with no credential in its URL. -- P10. A `Submodule` named `framework` was associated with the `LocalProject`. +- P10. A `Submodule` named `framework` was associated with the `LocalProject`, and the submodules the framework itself holds (`qc`) were initialised. - P11. A `HookSetup` instance was associated with the `LocalProject`, recording that skills and git hooks were installed once and, if `enablePlanGate`, that the plan gate was enabled. - P12. `AGENTS.md` and `docs/artifact-registry.md` exist in the `LocalProject`, each either newly copied from the framework templates or left as it was because the Maintainer declined to replace it. - P13. A `Summary` instance was created listing every created item, every skipped item and the next step for anything that failed, and is returned. It contains no credential. @@ -87,6 +87,7 @@ Concepts below use the IT terms of [DICT-001] for the PO concepts of [DM-001]. ` | `directory` exists, or a target file exists, and the Maintainer declines replacing it (P7, P12) | That item is skipped and listed in the `Summary` | | A `.env` already exists in the `LocalProject` and the Maintainer declines replacing it (P14) | That item is skipped and listed in the `Summary` | | A different `core.hooksPath` exists and the Maintainer declines replacing it (P11) | Hooks are not installed and this is listed in the `Summary` | +| The framework's own submodules cannot be fetched (P10) | The `Summary` lists the `framework` `Submodule` as added, its own submodules as failed, and the command `git submodule update --init --recursive` to run by hand | | SSH to port 10022 fails and the `Submodule` cannot be added (P10) | The `Summary` lists the repositories as created, the submodule as failed, and the SSH prerequisite | --- @@ -95,5 +96,4 @@ Concepts below use the IT terms of [DICT-001] for the PO concepts of [DM-001]. ` [DM-001]: ./dm.md [DICT-001]: ../dictionary.md [SD-001]: ./sd.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/uc-001/sd.md b/docs/uc-001/sd.md index 05926cb..c4a1a4a 100644 --- a/docs/uc-001/sd.md +++ b/docs/uc-001/sd.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Added CredentialCollector and EnvFileWriter and their messages (P2, P14) | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | The license that applies is passed to hasLicense and createRepository; no alt on the GitHub choice | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | P4: the license passed is AGPL-3.0 only for GitHub with a public project | pending | --- @@ -195,7 +195,7 @@ destroy SR | P1 ProjectRequest created | `provideProjectDetails` received by `ProjectCreator` | | P2 PreflightResult created, including that the license is offered | `check(request)` and `hasLicense(license)` | | P3 GiteaRepository created | `createRepository(request, license)` | -| P4 LicenseFile when a license applies, otherwise empty | `createRepository(request, license)`; `license` is the one the `ProjectRequest` carries (`PROJECT_LICENSE`, or AGPL-3.0 when GitHub was chosen), and is absent for `none` | +| P4 LicenseFile when a license applies, otherwise empty | `createRepository(request, license)`; `license` is the one the `ProjectRequest` carries (`PROJECT_LICENSE`, or AGPL-3.0 when GitHub was chosen and the project is public), and is absent for `none` | | P2 GitHub credentials known before the first request | `collect(configuration, GITHUB_PAT, GITHUB_USER)` inside `opt githubOwner present` | | P5 empty GitHubRepository when chosen | `createEmptyRepository(request)` | | P6 PushMirror and first sync | `addPushMirror(...)` and `requestSync(pushMirror)` | @@ -216,5 +216,4 @@ destroy SR [OC-001]: ./oc.md [DCD-001]: ./dcd.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/uc-001/ssd.md b/docs/uc-001/ssd.md index b47d0c1..8f8d466 100644 --- a/docs/uc-001/ssd.md +++ b/docs/uc-001/ssd.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | writeEnvFile parameter and the credentials that .env does not provide | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | The license is not a parameter: it comes from config.env or follows the GitHub choice | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | The license that follows the GitHub choice also needs a public project | pending | --- @@ -39,7 +39,7 @@ S --> A : creation summary | 1 | startProjectCreation | none | prompts for project details (after configuration and tool checks; a missing credential is asked first) | 1, 2 | | 2 | provideProjectDetails | name, description, visibility, giteaOwner, githubOwner (optional; given means GitHub is chosen; omitted means no GitHub), directory, enablePlanGate (each of these may come from `config.env` instead of the Maintainer; the message is unchanged), writeEnvFile (whether to create the project's `.env`), and the credentials that `.env` does not provide (GitHub ones only when GitHub is chosen) | checks passed, then a creation summary | 3 to 10 | -The license that applies is not a parameter: it is read from `config.env` (`PROJECT_LICENSE`) or, when none is set, follows the GitHub choice. +The license that applies is not a parameter: it is read from `config.env` (`PROJECT_LICENSE`) or, when none is set, follows the GitHub choice and the project's visibility (AGPL-3.0 only for GitHub with a public project). Steps 4 to 9 are internal to the system, so one operation covers them. A consent question (step 8a, 9a, 9b) is a prompt from the system and is out of scope for this diagram; failure flows are out of scope here. @@ -52,5 +52,4 @@ The system is one script run. It starts with the first operation and ends after [UC-001]: ./uc.md [DM-001]: ./dm.md [OC-001]: ./oc.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/uc-001/uc.md b/docs/uc-001/uc.md index f4bf107..9b69016 100644 --- a/docs/uc-001/uc.md +++ b/docs/uc-001/uc.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Credentials not in .env are asked (step 2, extension 2b); the project .env is created with consent (step 9, extensions 9c, 9d) | [ded26a6] | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | The license comes from PROJECT_LICENSE (step 6, extension 4c); AGPL-3.0 is only the default when GitHub is chosen | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License rule: the AGPL-3.0 default needs GitHub and a public project (step 6, rule 6); step 9 and extension 9e fetch the framework's own submodules | pending | --- @@ -31,7 +31,7 @@ - `git` and `curl` are installed. - The Maintainer has a Gitea token, a GitHub PAT and a GitHub account name (only when GitHub is chosen) and SSH access to Gitea on port 10022. - **Postconditions (success guarantee):** - - A repository exists on Gitea under the chosen owner. It is empty, or it holds the license file that applies: the license set in `config.env`, or AGPL-3.0 when the Maintainer chose GitHub and set none. + - A repository exists on Gitea under the chosen owner. It is empty, or it holds the license file that applies: the license set in `config.env`, or AGPL-3.0 when the Maintainer chose GitHub, the project is public and no license is set. - When the Maintainer chose to create a GitHub repository, an empty repository exists on GitHub under the chosen owner, the Gitea repository is a push mirror to it, and the license file, if any, reaches GitHub through the mirror. - A local project directory exists with credential-free remotes `origin` (Gitea) and, when GitHub was chosen, `github`, the `framework` submodule, installed skills and hooks, and the copied templates. - When the Maintainer agreed, the local project has a `.env` that holds only the credentials the project needs, is readable by its owner only and is ignored by git. @@ -44,10 +44,10 @@ 3. The Maintainer provides the repository name, description, visibility, the Gitea owner, whether to also create a GitHub repository (and if so its owner), the local directory, and whether to enable the plan gate. A detail that is set in `config.env` is not asked. 4. The system checks that the tokens needed for the chosen hosts work, that the owners accept new repositories, that the name is free on those hosts, that Gitea offers the license that applies (if any), and whether SSH to Gitea works. 5. Optional: if the Maintainer chose GitHub, the system creates the empty GitHub repository. -6. The system creates the Gitea repository. If a license applies, the repository is created with its license file and so is not empty; otherwise it is empty. The license that applies is the one set in `config.env` (`PROJECT_LICENSE`; `none` means no license); when none is set it is AGPL-3.0 if the Maintainer chose GitHub, and none otherwise. The license is never asked. +6. The system creates the Gitea repository. If a license applies, the repository is created with its license file and so is not empty; otherwise it is empty. The license that applies is the one set in `config.env` (`PROJECT_LICENSE`; `none` means no license); when none is set it is AGPL-3.0 if the Maintainer chose GitHub and the project is public, and none otherwise. The license is never asked. 7. Optional: if GitHub was chosen, the system configures the Gitea repository as a push mirror to GitHub and verifies it. A license file in the Gitea repository is pushed to GitHub by the mirror. 8. The system creates the local project with the `origin` remote and, if GitHub was chosen, the `github` remote. -9. The system adds the framework submodule, installs its skills and hooks (and the plan gate if chosen) and copies the templates. If the Maintainer agrees, it also creates the project's own `.env` with the credentials the project needs. +9. The system adds the framework submodule and fetches its own submodules (the `qc` checklists), installs its skills and hooks (and the plan gate if chosen) and copies the templates. If the Maintainer agrees, it also creates the project's own `.env` with the credentials the project needs. 10. The system reports a summary of what was created. ### Extensions (Alternative / Exception Flows) @@ -76,6 +76,8 @@ 1. The system creates none and says so in the summary. - 9d. A `.env` already exists in the project: 1. The system asks before replacing it; on no, it keeps it and reports it. +- 9e. The framework's own submodules cannot be fetched: + 1. The system stops the step, reports what exists and names the command to run by hand, `git submodule update --init --recursive`, without showing a credential. ### Special Requirements / Business Rules @@ -87,7 +89,7 @@ | 3 | The GitHub owner and the Gitea owner are chosen separately; `GITHUB_USER` is only the authenticating account | | 3 | A project detail set in `config.env` (the key is present, even if empty where an empty value is allowed) is not asked; only the confirmations stay interactive | | 3, 5, 7 | GitHub is optional; without it no GitHub repository, mirror or `github` remote is created and the GitHub credentials are not required | -| 6 | The license that applies is added to the Gitea repository when it is created, so that repository is not empty: `PROJECT_LICENSE` if set (a Gitea license key such as `MIT`, or `none`), otherwise AGPL-3.0 when GitHub is chosen, otherwise none. It is independent of the GitHub choice when set, and it is never asked | +| 6 | The license that applies is added to the Gitea repository when it is created, so that repository is not empty: `PROJECT_LICENSE` if set (a Gitea license key such as `MIT`, or `none`), otherwise AGPL-3.0 when GitHub is chosen and the project is public, otherwise none. It is independent of the GitHub choice when set, and it is never asked | | 7 | The mirror direction is Gitea to GitHub; the GitHub repository stays empty and receives its content from the mirror | | 8 | `origin` uses HTTPS derived from `GITEA_URL`, or SSH when the SSH test in step 4 passed; when the Gitea repository is not empty (GitHub chosen) the local project is created by fetching it, not by an unrelated `git init` history | | 8, 9 | Nothing is overwritten or deleted without consent, and no commit is made | @@ -102,5 +104,4 @@ [US-001]: ../user-stories.md [SA-001]: ../stakeholder-analysis.md [DM-001]: ./dm.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff diff --git a/docs/uc-002/dcd.md b/docs/uc-002/dcd.md new file mode 100644 index 0000000..1008319 --- /dev/null +++ b/docs/uc-002/dcd.md @@ -0,0 +1,87 @@ +# Design Class Diagram + +## Metadata +| Key | Value | +| --- | --- | +| ID | DCD-003 | +| CrossReference | [DM-003], [SD-002], [DICT-001], [UC-002], [DCD-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Purpose and Scope + +Covers [UC-002]. Adds the classes that start the script through a command link. `ProjectCreator`, `Configuration` and `Run` are the classes of [DCD-001] and change only as stated under Method Traceability. The consolidated diagram is [DCD-002]. + +## Diagram + +```plantuml +@startuml +class Launcher { + +resolveCheckout(invocation : Path) : Checkout + +currentFolder() : WorkingFolder + +startFromWorkingFolder(configPath : Path [0..1], envPath : Path [0..1]) : PromptSet +} +class Checkout { + -path : Path + +configFile() : Path + +envFile() : Path +} +class WorkingFolder { + -path : Path +} +class ProjectCreator { + +startProjectCreation(checkout : Checkout, workingFolder : WorkingFolder, configPath : Path [0..1], envPath : Path [0..1]) : PromptSet +} +class Run +Launcher "1" --> "1" ProjectCreator : starts +Launcher ..> Checkout : creates +Launcher ..> WorkingFolder : creates +Run "1" *-- "1" Checkout +Run "1" *-- "1" WorkingFolder +@enduml +``` + +## Class Table + +| Class | Refines (Domain Model concept) | Responsibility | Attributes | Operations | +| --- | --- | --- | --- | --- | +| `Launcher` | Command Link (the object that follows it) | Follows the command link to the checkout, takes the folder the Maintainer stands in, and starts the run. | none | `resolveCheckout`, `currentFolder`, `startFromWorkingFolder` | +| `Checkout` | Checkout | Names the folder that holds the script's own files and the default `config.env` and `.env`. | `path` | `configFile`, `envFile` | +| `WorkingFolder` | Working Folder | Names the base of the default directory of the new project. | `path` | none | + +The concept Command Link has no class: it is a link the Maintainer makes with the shell, and the system only follows it. + +## Method Traceability + +| Method signature | Operation Contract / SD message | +| --- | --- | +| `Launcher.startFromWorkingFolder(configPath, envPath) : PromptSet` | [SD-002] `startFromWorkingFolder`; P1, P6 | +| `Launcher.resolveCheckout(invocation) : Checkout` | [SD-002] `resolveCheckout(invocation)`; P2 | +| `Launcher.currentFolder() : WorkingFolder` | [SD-002] `currentFolder()`; P3 | +| `Checkout.configFile() : Path`, `Checkout.envFile() : Path` | [SD-002] `startProjectCreation`; P5 | +| `ProjectCreator.startProjectCreation(checkout, workingFolder, configPath, envPath) : PromptSet` | [SD-002] `startProjectCreation`; P4, P5, P6. Replaces the signature of [DCD-001] by adding `checkout`, `workingFolder`, `configPath` and `envPath` | + +## Pattern Annotations + +| Pattern | Classes | Rationale | +| --- | --- | --- | +| Controller | `Launcher` | One class takes the system operation of [UC-002] | +| Information Expert | `Launcher`, `Checkout` | The launcher knows the invocation; the checkout knows where its files are | + +## Dependency Check + +`Launcher` depends on `ProjectCreator`, `Checkout` and `WorkingFolder`; none of them depends on `Launcher`, so no cycle is added. + +--- + +[DM-003]: ./dm.md +[SD-002]: ./sd.md +[DICT-001]: ../dictionary.md +[UC-002]: ./uc.md +[DCD-001]: ../uc-001/dcd.md +[DCD-002]: ../dcd.md diff --git a/docs/uc-002/dm.md b/docs/uc-002/dm.md new file mode 100644 index 0000000..d6ac481 --- /dev/null +++ b/docs/uc-002/dm.md @@ -0,0 +1,84 @@ +# Domain Model + +## Metadata +| Key | Value | +| --- | --- | +| ID | DM-003 | +| CrossReference | [UC-002], [UCD-001], [SSD-002], [DICT-001], [DM-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Purpose and Scope + +Covers [UC-002] "Start the script as a global command". The concepts come from the nouns of that use case and use the PO terms of [DICT-001]. The concepts `Maintainer`, `Configuration`, `Project` and `Local Project` are those of [DM-001] and are not redefined here. The project-level model that consolidates all use cases is [DM-002]. + +## Diagram + +Concepts, attributes and associations only — no operations. + +```plantuml +@startuml +class Maintainer { + name +} +class "Command Link" as CommandLink { + name + folder +} +class Checkout { + path +} +class "Working Folder" as WorkingFolder { + path +} +class Configuration { + preset project details +} +class "Local Project" as LocalProject { + path +} +Maintainer "1" --> "0..*" CommandLink : makes +CommandLink "0..*" --> "1" Checkout : leads to +Maintainer "1" --> "1" WorkingFolder : starts the script in +Checkout "1" --> "1" Configuration : holds by default +WorkingFolder "1" --> "0..*" LocalProject : is the base of +@enduml +``` + +## Concept Table + +| Concept | Definition | Attributes | Source (use case / glossary) | +| --- | --- | --- | --- | +| Command Link | A name in a folder on the shell's search path that leads to the script in the checkout | name, folder | [UC-002] step 1 "command link" | +| Checkout | The folder that holds RepoFoundry: the script, its own files and by default `config.env` and `.env` | path | [UC-002] step 4 "checkout" | +| Working Folder | The folder in which the Maintainer starts the script and under which the new project is created by default | path | [UC-002] step 2 "working folder" | + +## Association Table + +| From | Association (reading direction) | To | Multiplicity | +| --- | --- | --- | --- | +| Maintainer | makes | Command Link | 1 to 0..* | +| Command Link | leads to | Checkout | 0..* to 1 | +| Maintainer | starts the script in | Working Folder | 1 to 1 | +| Checkout | holds by default | Configuration | 1 to 1 | +| Working Folder | is the base of | Local Project | 1 to 0..* | + +## Generalizations + +| General | Specializations | Is-a justification | +| --- | --- | --- | +| None | - | - | + +--- + +[UC-002]: ./uc.md +[UCD-001]: ../use-case-diagram.md +[SSD-002]: ./ssd.md +[DICT-001]: ../dictionary.md +[DM-001]: ../uc-001/dm.md +[DM-002]: ../domain-model.md diff --git a/docs/uc-002/oc.md b/docs/uc-002/oc.md new file mode 100644 index 0000000..fe537c0 --- /dev/null +++ b/docs/uc-002/oc.md @@ -0,0 +1,53 @@ +# Operation Contract + +## Metadata +| Key | Value | +| --- | --- | +| ID | OC-002 | +| CrossReference | [SSD-002], [DM-003], [DICT-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +Concepts below use the IT terms of [DICT-001] for the PO concepts of [DM-003]. `Run` and `PromptSet` are the system concepts of [OC-001]. The operation `provideProjectDetails` is the one of [OC-001]; the only change is the base of its default `directory`, stated in P4. + +## Contract: startFromWorkingFolder + +| Item | Value | +| --- | --- | +| Operation | `startFromWorkingFolder(configPath: Path [0..1], envPath: Path [0..1]): PromptSet` | +| Traces to | `startFromWorkingFolder` in [SSD-002] | +| Concepts | Run, CommandLink, Checkout, WorkingFolder, Configuration | + +**Preconditions** + +- A `CommandLink` exists that leads to the script in a `Checkout`, or the Maintainer started the script by its path. +- The Maintainer is in a `WorkingFolder`. + +**Postconditions** + +- P1. A `Run` instance was created. +- P2. A `Checkout` instance was created and associated with the `Run`, with `path` set to the folder that holds the script's own files, reached through the `CommandLink`, however many links lie between them. +- P3. A `WorkingFolder` instance was created and associated with the `Run`, with `path` set to the folder in which the Maintainer started the script. It was not changed by following the `CommandLink`. +- P4. The default of `directory` in the `PromptSet` is `./` under the `WorkingFolder`, never under the `Checkout`. +- P5. A `Configuration` instance was created and associated with the `Run` from `configPath`, or from `config.env` in the `Checkout` when `configPath` is absent, and from `envPath`, or from `.env` in the `Checkout` when `envPath` is absent; the validation of [OC-001] `startProjectCreation` P2 and P3 applies. +- P6. The `Run` was associated with a `PromptSet` that is returned. + +**Exceptions** + +| Condition (failing precondition) | Outcome | +| --- | --- | +| The `Checkout`'s own files are not found from the link target | The `Run` ends with an error naming the folder it looked in; nothing was changed | +| `config.env` or `.env` is not found in the `Checkout` and no path was given (P5) | The `Run` ends with an error naming the path it looked in and the options `--config` and `--env`; nothing was changed | +| A value in `config.env` or `.env` is malformed (P5) | As in [OC-001] `startProjectCreation`: the error names the key, never its value; nothing was changed | + +--- + +[SSD-002]: ./ssd.md +[DM-003]: ./dm.md +[DICT-001]: ../dictionary.md +[OC-001]: ../uc-001/oc.md diff --git a/docs/uc-002/sd.md b/docs/uc-002/sd.md new file mode 100644 index 0000000..46c65f9 --- /dev/null +++ b/docs/uc-002/sd.md @@ -0,0 +1,84 @@ +# Sequence Diagram + +## Metadata +| Key | Value | +| --- | --- | +| ID | SD-002 | +| CrossReference | [OC-002], [DCD-003], [DICT-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +Design objects are conceptual; in `create-project.sh` each becomes a small function group. [DCD-003] gives each object its class and turns each message below into a method signature. `ProjectCreator` and `ConfigLoader` are the design objects of [SD-001]. + +## Sequence: startFromWorkingFolder + +**Realizes:** `startFromWorkingFolder` in [OC-002] + +### Diagram + +```plantuml +@startuml +actor Maintainer +participant ":Launcher" as L +participant ":ProjectCreator" as PC +participant ":Checkout" as CK +participant ":WorkingFolder" as WF + +Maintainer -> L : startFromWorkingFolder(configPath, envPath) +activate L +L -> L : resolveCheckout(invocation) +create CK +L -> CK : Checkout(path) +L -> L : currentFolder() +create WF +L -> WF : WorkingFolder(path) +alt the Checkout's own files are not found + L --> Maintainer : error naming the folder looked in +end +L -> PC : startProjectCreation(checkout, workingFolder, configPath, envPath) +activate PC +alt config.env or .env not found, or a value malformed + PC --> L : error naming the path or the key +end +PC --> L : promptSet +deactivate PC +L --> Maintainer : promptSet +deactivate L +@enduml +``` + +### Pattern Annotations + +| Pattern (GRASP / GoF) | Applied to | Rationale | +| --- | --- | --- | +| Information Expert | `Launcher.resolveCheckout` | The launcher knows how the script was invoked, so it is the one that can follow the command link | +| Controller | `Launcher` | One object takes the system operation and hands the work to `ProjectCreator`; `ProjectCreator` stays unaware of links | +| Low Coupling | `ProjectCreator` receives `checkout` and `workingFolder` as values | The use case [UC-001] runs unchanged whatever way the script was started | + +### Postcondition Coverage + +| Postcondition (from contract) | Satisfied by message | +| --- | --- | +| P1 Run | `startFromWorkingFolder` (the run starts with it) | +| P2 Checkout | `resolveCheckout(invocation)` and the creation of `Checkout` | +| P3 WorkingFolder | `currentFolder()` and the creation of `WorkingFolder` | +| P4 default directory under the WorkingFolder | `startProjectCreation(checkout, workingFolder, ...)`; the prompt default is built from `workingFolder` | +| P5 Configuration | `startProjectCreation` loads `config.env` and `.env` from `checkout` or from the given paths (`load` of [SD-001]) | +| P6 PromptSet | the returned `promptSet` | +| Exceptions: files not found; configuration not found or malformed | the two `alt` fragments | + +### Responsibility Check + +`Launcher` only finds the checkout and the working folder; it reads no configuration and makes no repository. `ProjectCreator` keeps every other responsibility of [SD-001]. + +--- + +[OC-002]: ./oc.md +[DCD-003]: ./dcd.md +[DICT-001]: ../dictionary.md +[SD-001]: ../uc-001/sd.md diff --git a/docs/uc-002/ssd.md b/docs/uc-002/ssd.md new file mode 100644 index 0000000..f704e56 --- /dev/null +++ b/docs/uc-002/ssd.md @@ -0,0 +1,50 @@ +# System Sequence Diagram + +## Metadata +| Key | Value | +| --- | --- | +| ID | SSD-002 | +| CrossReference | [UC-002], [DM-003] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +## Source Use Case + +Start the script as a global command ([UC-002]) — scenario: main success scenario + +## Diagram + +```plantuml +@startuml +actor Maintainer as A +participant ":System" as S +A -> S : startFromWorkingFolder(configPath, envPath) +S --> A : prompts for project details +A -> S : provideProjectDetails(...) +S --> A : creation summary with the project's full path +@enduml +``` + +## System Operations + +| Step | Message | Parameters | Return | Use case step | +| --- | --- | --- | --- | --- | +| 3 to 4 | startFromWorkingFolder | configPath (optional), envPath (optional) | prompts for project details whose default directory is under the working folder | 3, 4, 5 | +| 5 | provideProjectDetails | the parameters of `provideProjectDetails` in [UC-001] | creation summary that names the full path of the new project | 5, 6 | + +Failure flows (extensions 1a, 3a, 4a and 4b of [UC-002]) are out of scope for this diagram: they end the run with a message and add no system operation. `provideProjectDetails` is the operation of [UC-001] and is not repeated in [OC-002]; the only difference is the base of the default `directory`. Making the command link (step 1) and opening the shell (step 2) are done by the Maintainer outside the system, so they are not system operations. + +## Lifecycle Notes + +One script run, as in [UC-001]. The command link persists between runs; the system keeps no state of it. + +--- + +[UC-002]: ./uc.md +[DM-003]: ./dm.md +[OC-002]: ./oc.md diff --git a/docs/uc-002/uc.md b/docs/uc-002/uc.md new file mode 100644 index 0000000..81102c1 --- /dev/null +++ b/docs/uc-002/uc.md @@ -0,0 +1,74 @@ +# Start the script as a global command + +## Metadata +| Key | Value | +| --- | --- | +| ID | UC-002 | +| CrossReference | [UCD-001], [US-001], [SA-001], [BC-001] | + +## Version History +| Date | Status | Author | Reviewer | Change | Commit | +| --- | --- | --- | --- | --- | --- | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | + +--- + +**Format:** Fully Dressed + +## Fully Dressed + +- **Scope:** RepoFoundry (`create-project.sh`) +- **Level:** user-goal +- **Primary Actor:** Maintainer (S01 or S02; one person holds both roles for now) +- **Stakeholders and Interests:** + - S01 — the script is started by name from any folder, and the new project lands where S01 stands + - S02 — starting through a link never reads or writes outside the checkout and the current folder + - S03 — the README says exactly how to make the command global +- **Preconditions:** + - The checkout of RepoFoundry exists and holds `config.env` and `.env` as described in the README, or the Maintainer points to them with `--config` and `--env`. + - A folder that is on the shell's `PATH` exists and the Maintainer may write to it. +- **Postconditions (success guarantee):** + - A command link exists in a `PATH` folder and leads to the script in the checkout. + - The Maintainer started the script by that name from a working folder, and use case [UC-001] ran with that working folder as its base: the default directory of the new project is `./` under it. + - Nothing was written outside the working folder and the new project. + +### Main Success Scenario + +1. The Maintainer makes the script reachable by name: creates a command link in a `PATH` folder that leads to `src/create-project.sh` in the checkout (the README gives the command). +2. The Maintainer opens a shell in the folder in which the new project is to be created (the working folder). +3. The Maintainer starts the script by the name of the command link. +4. The system follows the command link to the checkout, loads its own files from there, and reads `config.env` and `.env` from the checkout, or from the files named by `--config` and `--env`. +5. The system runs [UC-001] (`<>`) with the working folder as the base of the default directory of the new project. +6. The system reports a summary that names the full path of the new project. + +### Extensions (Alternative / Exception Flows) + +- 1a. The `PATH` folder is not writable, or not on `PATH`: + 1. The README names the other choices (a folder the Maintainer owns and adds to `PATH`, or an alias); the system is not involved. +- 3a. The command link is broken (the checkout was moved or removed): + 1. The shell reports that the command cannot run; the README says how to recreate the link. +- 4a. The checkout's own files cannot be found from the link target: + 1. The system stops before any change and names the folder it looked in. +- 4b. `config.env` or `.env` is not found: + 1. The system stops before any change, names the path it looked in and says that `--config` and `--env` can point elsewhere. + +### Special Requirements / Business Rules + +| Step | Rule | +| --- | --- | +| 1 | The command link is made by the Maintainer with the shell, not by the script; the script never edits `PATH`, a shell profile or a system folder | +| 4 | The system finds its own files by following the command link, however many links lie on the way, on every supported platform | +| 4 | `config.env` and `.env` are read from the checkout, never from the working folder, unless `--config` and `--env` name them | +| 5 | The base of the default directory is the working folder, never the checkout | +| 3 to 6 | Behaviour, prompts and summary are the same as when the script is started by its path from the checkout | + +### Open Issues + +- The README example is tested on Linux, macOS and Git Bash on Windows (MIL-007 criterion 6). + +--- + +[UCD-001]: ../use-case-diagram.md +[US-001]: ../user-stories.md +[SA-001]: ../stakeholder-analysis.md +[BC-001]: ../business-case.md diff --git a/docs/use-case-diagram.md b/docs/use-case-diagram.md index 68853f8..9248c8d 100644 --- a/docs/use-case-diagram.md +++ b/docs/use-case-diagram.md @@ -4,12 +4,13 @@ | Key | Value | | --- | --- | | ID | UCD-001 | -| CrossReference | [SA-001], [BC-001], [US-001], [UC-001] | +| CrossReference | [SA-001], [BC-001], [US-001], [UC-001], [UC-002] | ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-05 | Accepted | Jens Tirsvad Nielsen | S02 | Initial version | [02875ae] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added UC-002 Start the script as a global command (includes UC-001) | pending | --- @@ -25,8 +26,11 @@ left to right direction actor "Maintainer" as M <> rectangle "RepoFoundry" <> { usecase "Create a new project" as UC1 + usecase "Start the script as a global command" as UC2 } M --> UC1 +M --> UC2 +UC2 ..> UC1 : <> @enduml ``` @@ -34,18 +38,20 @@ M --> UC1 | Actor | Stereotype | Stakeholder ID (SA) | Goals (use cases) | | --- | --- | --- | --- | -| Maintainer | `<>` | S01, S02 | Create a new project | +| Maintainer | `<>` | S01, S02 | Create a new project; start the script as a global command | ## Use Case Table | Use Case | Actor(s) | Goal | | --- | --- | --- | +| Start the script as a global command ([UC-002]) | Maintainer | Start the script by name from the folder in which the new project is to be created | | Create a new project ([UC-001]) | Maintainer | Start a new project with a Gitea repository, optionally a GitHub repository and mirror, and a local project with the SQA-QC-Framework | ## Relationships | From | Relationship (`<>` / `<>`) | To | Justification | | --- | --- | --- | --- | +| [UC-002] | `<>` | [UC-001] | Starting by name always ends in creating a project; the project creation is the same whatever way the script was started | | None | - | - | The optional GitHub steps are steps 5 and 7 of [UC-001], not a separate goal of the Maintainer, so they are not modelled as an `<>` use case | --- @@ -54,4 +60,5 @@ M --> UC1 [BC-001]: ./business-case.md [US-001]: ./user-stories.md [UC-001]: ./uc-001/uc.md +[UC-002]: ./uc-002/uc.md [02875ae]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/02875aee5f2953473924074eea0056eb31af6b7a diff --git a/docs/user-stories.md b/docs/user-stories.md index 39c73cc..66f599a 100644 --- a/docs/user-stories.md +++ b/docs/user-stories.md @@ -4,13 +4,13 @@ | Key | Value | | --- | --- | | ID | US-001 | -| CrossReference | [BC-001], [UCD-001], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006] | +| CrossReference | [BC-001], [UCD-001], [UC-002], [MIL-001], [MIL-002], [MIL-003], [MIL-004], [MIL-005], [MIL-006], [MIL-007] | ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-06 | Accepted | Jens Tirsvad Nielsen | S02 | Added US-001.05: credentials asked when missing and kept in the project .env | [ded26a6] | -| 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Added US-001.06: the license set in config.env; US-001.02 names the license that applies | [d773fa9] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | US-001.06: AGPL-3.0 default only for a public project with GitHub; US-001.07: the framework's own submodules (qc) are fetched | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added US-002 (global command from the target folder) for UC-002 | pending | --- @@ -18,7 +18,7 @@ One epic: "Create a new project" ([UC-001]), setting up a new project on Gitea, optionally on GitHub, with the SQA-QC-Framework in place. The actor is the Maintainer, as in [UCD-001] (S01 or S02; for now one person holds both roles). -The epic is split into six stories, one per milestone. Each story fits one two-week phase and can be shown working at the end of it. +The epic is split into seven stories, one per milestone (US-001.01 to US-001.07). Each story fits one two-week phase and can be shown working at the end of it. ## Story List @@ -42,7 +42,7 @@ The epic is split into six stories, one per milestone. Each story fits one two-w **Acceptance Criteria** -- Given valid tokens and owners, when the script runs, then a Gitea repository exists under the chosen owner: empty, or holding the license that applies (the one set in `PROJECT_LICENSE`, or AGPL-3.0 when GitHub was chosen). +- Given valid tokens and owners, when the script runs, then a Gitea repository exists under the chosen owner: empty, or holding the license that applies (the one set in `PROJECT_LICENSE`, or AGPL-3.0 when GitHub was chosen and the project is public). - Given GitHub was chosen, when the script runs, then an empty GitHub repository exists under its chosen owner (not assumed to be `GITHUB_USER`) and Gitea mirrors to it, and no credential is stored in any address. - Given a step fails, when the script stops, then it reports what was created and how to continue. @@ -97,13 +97,13 @@ The epic is split into six stories, one per milestone. Each story fits one two-w ### US-001.06 — Create a new project: choose the license in `config.env` -**As a** Maintainer, **I want** to set the project's license in `config.env`, **so that** a project is not forced to AGPL-3.0 by the GitHub choice and does not need a question for it. +**As a** Maintainer, **I want** to set the project's license in `config.env`, **so that** a project is not forced to AGPL-3.0 by the GitHub choice, a private project is never given it by default, and no question is needed for it. **Acceptance Criteria** - Given `PROJECT_LICENSE` is set to a license the Gitea server offers, when the script creates the Gitea repository, then it holds that license, with or without GitHub, and the license is not asked. - Given `PROJECT_LICENSE=none`, then the repository has no license even when GitHub is chosen. -- Given `PROJECT_LICENSE` is absent, then the license is AGPL-3.0 when GitHub is chosen and none otherwise, as before. +- Given `PROJECT_LICENSE` is absent, then the license is AGPL-3.0 when GitHub is chosen and the project is public, and none otherwise (a private project with GitHub gets none). - Given the value is empty or invalid, or the server does not offer it, when the script starts or checks the hosts, then it stops before anything is created and names the key or the license. - Given GitHub is chosen, then the license reaches the GitHub repository through the mirror, as before. @@ -111,21 +111,56 @@ The epic is split into six stories, one per milestone. Each story fits one two-w | --- | --- | --- | | [UC-001] steps 3, 4 and 6, [MIL-006] | fits one phase | Independent: needs the configurable details of US-001.04 | +### US-001.07 — Create a new project: the framework's own submodules are fetched + +**As a** Maintainer, **I want** the new project to hold the framework together with its own submodules, **so that** the `qc` checklists are present without a manual step. + +**Acceptance Criteria** + +- Given the framework is added to the new project, when the step finishes, then `git submodule update --init --recursive` has run in the project and the framework's `qc` directory holds the checklists. +- Given `framework` already exists as the framework submodule, when the script runs again, then the same command runs, so an empty `qc` is filled and nothing else changes. +- Given the nested fetch fails, then the script stops that step, reports what exists, names the command to run by hand and does not show a credential. +- Given the framework has no submodule of its own, then the step changes nothing and does not fail. + +| Traces to | Size | INVEST exceptions | +| --- | --- | --- | +| [UC-001] step 9, [MIL-007] | fits one phase | Independent: needs the framework step of US-001.03 | + +## Epic: Start the script as a global command + +One further epic, "Start the script as a global command" ([UC-002]), with one story. The actor is the Maintainer. + +### US-002 — Start the script by name from the folder where the project is to be created + +**As a** Maintainer, **I want** to start the script by a name from any folder and have the project created in the folder I stand in, **so that** I do not have to enter the checkout or type its path each time. + +**Acceptance Criteria** + +- Given a command link in a folder on `PATH` that leads to the script, when the Maintainer starts it by name from another folder, then the script runs, finds its own files and reads `config.env` and `.env` from the checkout. +- Given the Maintainer stands in a folder, when the project directory is not preset, then its default is `./` under that folder, never under the checkout. +- Given `--config` and `--env` name other files, then those are read instead of the checkout's. +- Given a missing file or a broken link, then the script stops before any change and names the folder or path it looked in. +- Given the README, then it shows the command that makes the link, the check that it works and a run from a folder that is not the checkout. + +| Traces to | Size | INVEST exceptions | +| --- | --- | --- | +| [UC-002], [MIL-007] | fits one phase | Independent: needs the script of [UC-001] | + ## INVEST Check -Valuable, Negotiable, Estimable, Small and Testable hold for each story. Independent holds only in part: the stories are ordered, each using what the one before it delivers, which follows the milestone order in [PP-001]. This is flagged as an exception on US-001.02 to US-001.06. +Valuable, Negotiable, Estimable, Small and Testable hold for each story. Independent holds only in part: the stories are ordered, each using what the one before it delivers, which follows the milestone order in [PP-001]. This is flagged as an exception on US-001.02 to US-001.07 and on US-002. --- [BC-001]: ./business-case.md [UCD-001]: ./use-case-diagram.md [UC-001]: ./uc-001/uc.md +[UC-002]: ./uc-002/uc.md [MIL-001]: ./milestones/mil-001-foundation.md [MIL-002]: ./milestones/mil-002-repositories-and-mirror.md [MIL-003]: ./milestones/mil-003-scaffold-and-release.md [MIL-004]: ./milestones/mil-004-configurable-details.md [MIL-005]: ./milestones/mil-005-credentials.md [MIL-006]: ./milestones/mil-006-project-license.md +[MIL-007]: ./milestones/mil-007-framework-checklists.md [PP-001]: ./project-plan.md -[ded26a6]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/ded26a658c666bf29d84093cb352e3635e07719b -[d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff -- 2.54.0 From 250df38d79a03ee878026136170440d4cf454413 Mon Sep 17 00:00:00 2001 From: Jens Tirsvad Nielsen Date: Wed, 7 Oct 2026 12:31:07 +0800 Subject: [PATCH 2/2] Resolve pending commit links for MIL-007, UC-002 and the license rule --- docs/business-case.md | 5 +++-- docs/dcd.md | 3 ++- docs/dictionary.md | 3 ++- docs/domain-model.md | 5 +++-- docs/milestones/mil-006-project-license.md | 3 ++- docs/milestones/mil-007-framework-checklists.md | 5 +++-- docs/project-plan.md | 3 ++- docs/sqa/reviews/rc-022-mil-007.md | 3 ++- docs/sqa/reviews/rc-023-uc-002.md | 3 ++- docs/sqa/reviews/rc-024-ssd-002.md | 3 ++- docs/sqa/reviews/rc-025-dm-003.md | 3 ++- docs/sqa/reviews/rc-026-oc-002.md | 3 ++- docs/sqa/reviews/rc-027-sd-002.md | 3 ++- docs/sqa/reviews/rc-028-dcd-003.md | 3 ++- docs/sqa/traceability-matrix.md | 3 ++- docs/uc-001/dm.md | 3 ++- docs/uc-001/oc.md | 3 ++- docs/uc-001/sd.md | 3 ++- docs/uc-001/ssd.md | 3 ++- docs/uc-001/uc.md | 3 ++- docs/uc-002/dcd.md | 3 ++- docs/uc-002/dm.md | 3 ++- docs/uc-002/oc.md | 3 ++- docs/uc-002/sd.md | 3 ++- docs/uc-002/ssd.md | 3 ++- docs/uc-002/uc.md | 3 ++- docs/use-case-diagram.md | 3 ++- docs/user-stories.md | 5 +++-- 28 files changed, 60 insertions(+), 32 deletions(-) diff --git a/docs/business-case.md b/docs/business-case.md index a2f6607..f0b1237 100644 --- a/docs/business-case.md +++ b/docs/business-case.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Objectives 2, 5 and 10, two scope items and success criterion 10: the AGPL-3.0 default needs GitHub and a public project; the framework's own submodules (qc) are fetched | pending | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added objective 11 (global command, project created in the current folder), a scope item and success criterion 11 | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Objectives 2, 5 and 10, two scope items and success criterion 10: the AGPL-3.0 default needs GitHub and a public project; the framework's own submodules (qc) are fetched | [1cd27f7] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added objective 11 (global command, project created in the current folder), a scope item and success criterion 11 | [1cd27f7] | --- @@ -153,3 +153,4 @@ Proceed — the procedure is small, well bounded and removes a repeated, securit [SA-001]: ./stakeholder-analysis.md [UCD-001]: ./use-case-diagram.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/dcd.md b/docs/dcd.md index 7d693b4..ec085d1 100644 --- a/docs/dcd.md +++ b/docs/dcd.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | ProjectRequest carries the license that applies (from DCD-001) | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Launcher, Checkout and WorkingFolder; startProjectCreation takes the checkout and working folder (from DCD-003, UC-002) | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Launcher, Checkout and WorkingFolder; startProjectCreation takes the checkout and working folder (from DCD-003, UC-002) | [1cd27f7] | --- @@ -363,3 +363,4 @@ SOLID check: no class has more than one reason to change (one host API, one kind [MIL-005]: ./milestones/mil-005-credentials.md [DICT-001]: ./dictionary.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/dictionary.md b/docs/dictionary.md index 4f13de1..d54e024 100644 --- a/docs/dictionary.md +++ b/docs/dictionary.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | LicenseFile definition no longer tied to GitHub | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Command Link, Checkout and Working Folder (DM-003, UC-002) | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Command Link, Checkout and Working Folder (DM-003, UC-002) | [1cd27f7] | --- @@ -68,3 +68,4 @@ Maps each Product Owner (PO) term to its professional IT term. PO language: Engl [OC-001]: ./uc-001/oc.md [DCD-001]: ./uc-001/dcd.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/domain-model.md b/docs/domain-model.md index 22a941c..73c57d7 100644 --- a/docs/domain-model.md +++ b/docs/domain-model.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License: the AGPL-3.0 default needs GitHub and a public project | pending | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Command Link, Checkout and Working Folder (from DM-003, UC-002) | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License: the AGPL-3.0 default needs GitHub and a public project | [1cd27f7] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added Command Link, Checkout and Working Folder (from DM-003, UC-002) | [1cd27f7] | --- @@ -205,3 +205,4 @@ WorkingFolder "1" --> "0..*" LocalProject : is the base of [SSD-001]: ./uc-001/ssd.md [DICT-001]: ./dictionary.md [DM-001]: ./uc-001/dm.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/milestones/mil-006-project-license.md b/docs/milestones/mil-006-project-license.md index 7b0e1b4..795d795 100644 --- a/docs/milestones/mil-006-project-license.md +++ b/docs/milestones/mil-006-project-license.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | AGPL-3.0 default only when GitHub is chosen and the project is public (purpose, resolution order, criterion 3, tasks 1 and 4) | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | AGPL-3.0 default only when GitHub is chosen and the project is public (purpose, resolution order, criterion 3, tasks 1 and 4) | [1cd27f7] | --- @@ -85,3 +85,4 @@ The license that applies is resolved in this order: `PROJECT_LICENSE` when set ( [DCD-001]: ../uc-001/dcd.md [MIL-004]: ./mil-004-configurable-details.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/milestones/mil-007-framework-checklists.md b/docs/milestones/mil-007-framework-checklists.md index 78a35c5..4f55fd4 100644 --- a/docs/milestones/mil-007-framework-checklists.md +++ b/docs/milestones/mil-007-framework-checklists.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added UC-002 and US-002 (global command); tasks 2 and 3 trace to UC-002 | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added UC-002 and US-002 (global command); tasks 2 and 3 trace to UC-002 | [1cd27f7] | --- @@ -79,3 +79,4 @@ Decide whether a new project holds the whole framework, including the `qc` check [UC-001]: ../uc-001/uc.md [UC-002]: ../uc-002/uc.md [MIL-003]: ./mil-003-scaffold-and-release.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/project-plan.md b/docs/project-plan.md index a17fe8c..b354cb3 100644 --- a/docs/project-plan.md +++ b/docs/project-plan.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Added phase MIL-006 (proposed dates 2026-11-30 to 2026-12-04) | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added phase MIL-007 (proposed dates 2026-12-07 to 2026-12-11); MIL-006 deliverable names the public-only AGPL-3.0 default | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added phase MIL-007 (proposed dates 2026-12-07 to 2026-12-11); MIL-006 deliverable names the public-only AGPL-3.0 default | [1cd27f7] | --- @@ -114,3 +114,4 @@ A No-Go moves every later date by the time needed to rework the failed criteria. [Milestone 44]: https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry/milestone/44 [Milestone 45]: https://git.tirsystem.com/TirSystem-BashScript/RepoFoundry/milestone/45 [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/sqa/reviews/rc-022-mil-007.md b/docs/sqa/reviews/rc-022-mil-007.md index 38cd108..9fe4cb0 100644 --- a/docs/sqa/reviews/rc-022-mil-007.md +++ b/docs/sqa/reviews/rc-022-mil-007.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -69,3 +69,4 @@ Go — [MIL-007] meets every mandatory criterion and the changes to the other ar [QC-MIL-001]: ../../../framework/qc/qc-milestones-gateways.md [MIL-003]: ../../milestones/mil-003-scaffold-and-release.md [MIL-005]: ../../milestones/mil-005-credentials.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/sqa/reviews/rc-023-uc-002.md b/docs/sqa/reviews/rc-023-uc-002.md index ea81b93..59f614d 100644 --- a/docs/sqa/reviews/rc-023-uc-002.md +++ b/docs/sqa/reviews/rc-023-uc-002.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -60,3 +60,4 @@ Go — [UC-002] meets every mandatory criterion. Drafted by Claude Code for S02 [UCD-001]: ../../use-case-diagram.md [US-001]: ../../user-stories.md [QC-UC-001]: ../../../framework/qc/qc-use-case.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/sqa/reviews/rc-024-ssd-002.md b/docs/sqa/reviews/rc-024-ssd-002.md index bd71d48..c18878c 100644 --- a/docs/sqa/reviews/rc-024-ssd-002.md +++ b/docs/sqa/reviews/rc-024-ssd-002.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -47,3 +47,4 @@ Go — [SSD-002] meets every mandatory criterion after the fix recorded under cr [UC-002]: ../../uc-002/uc.md [DM-003]: ../../uc-002/dm.md [QC-SSD-001]: ../../../framework/qc/qc-ssd.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/sqa/reviews/rc-025-dm-003.md b/docs/sqa/reviews/rc-025-dm-003.md index 8ba1fd9..142b7f7 100644 --- a/docs/sqa/reviews/rc-025-dm-003.md +++ b/docs/sqa/reviews/rc-025-dm-003.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -71,3 +71,4 @@ Go — [DM-003] and the dictionary meet every mandatory criterion. Drafted by Cl [QC-DM-001]: ../../../framework/qc/qc-domain-model.md [QC-DICT-001]: ../../../framework/qc/qc-dictionary.md [UC-002]: ../../uc-002/uc.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/sqa/reviews/rc-026-oc-002.md b/docs/sqa/reviews/rc-026-oc-002.md index c524eea..ce84cce 100644 --- a/docs/sqa/reviews/rc-026-oc-002.md +++ b/docs/sqa/reviews/rc-026-oc-002.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -55,3 +55,4 @@ Go — [OC-002] meets every mandatory criterion. Drafted by Claude Code for S02 [DM-003]: ../../uc-002/dm.md [QC-OC-001]: ../../../framework/qc/qc-operation-contract.md [UC-001]: ../../uc-001/uc.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/sqa/reviews/rc-027-sd-002.md b/docs/sqa/reviews/rc-027-sd-002.md index da11322..504b3aa 100644 --- a/docs/sqa/reviews/rc-027-sd-002.md +++ b/docs/sqa/reviews/rc-027-sd-002.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -48,3 +48,4 @@ Go — [SD-002] meets every mandatory criterion after the fix recorded under cri [OC-002]: ../../uc-002/oc.md [DCD-003]: ../../uc-002/dcd.md [QC-SD-001]: ../../../framework/qc/qc-sequence-diagram.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/sqa/reviews/rc-028-dcd-003.md b/docs/sqa/reviews/rc-028-dcd-003.md index 1030fd7..863cab0 100644 --- a/docs/sqa/reviews/rc-028-dcd-003.md +++ b/docs/sqa/reviews/rc-028-dcd-003.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -60,3 +60,4 @@ Go-with-conditions — [DCD-003] meets every mandatory criterion, but the consol [MIL-007]: ../../milestones/mil-007-framework-checklists.md [QC-DCD-001]: ../../../framework/qc/qc-dcd.md [OC-002]: ../../uc-002/oc.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/sqa/traceability-matrix.md b/docs/sqa/traceability-matrix.md index 12e6b69..5495783 100644 --- a/docs/sqa/traceability-matrix.md +++ b/docs/sqa/traceability-matrix.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | Added MIL-006 | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added MIL-007, UC-002, SSD-002, DM-003, OC-002, SD-002 and DCD-003 with their reviews RC-022 to RC-028 | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added MIL-007, UC-002, SSD-002, DM-003, OC-002, SD-002 and DCD-003 with their reviews RC-022 to RC-028 | [1cd27f7] | --- @@ -115,3 +115,4 @@ updated whenever an artifact instance is created or reviewed. [RC-016]: ./reviews/rc-016-create-project-sh.md [RC-017]: ./reviews/rc-017-e2e-security-review.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-001/dm.md b/docs/uc-001/dm.md index 1fad4ac..744d7c1 100644 --- a/docs/uc-001/dm.md +++ b/docs/uc-001/dm.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | License applies when configured, not only when GitHub is chosen | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License: the AGPL-3.0 default needs GitHub and a public project | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License: the AGPL-3.0 default needs GitHub and a public project | [1cd27f7] | --- @@ -181,3 +181,4 @@ Summary "1" --> "1" Project : reports on [DICT-001]: ../dictionary.md [DM-002]: ../domain-model.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-001/oc.md b/docs/uc-001/oc.md index d403e03..aba4532 100644 --- a/docs/uc-001/oc.md +++ b/docs/uc-001/oc.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | P2, P4 and an exception: the license that applies, not always AGPL-3.0 | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | P4: the AGPL-3.0 default needs githubOwner and a public visibility; P10: the framework's own submodules were initialised, with an exception for a failed fetch | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | P4: the AGPL-3.0 default needs githubOwner and a public visibility; P10: the framework's own submodules were initialised, with an exception for a failed fetch | [1cd27f7] | --- @@ -97,3 +97,4 @@ Concepts below use the IT terms of [DICT-001] for the PO concepts of [DM-001]. ` [DICT-001]: ../dictionary.md [SD-001]: ./sd.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-001/sd.md b/docs/uc-001/sd.md index c4a1a4a..ce9b2ec 100644 --- a/docs/uc-001/sd.md +++ b/docs/uc-001/sd.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | The license that applies is passed to hasLicense and createRepository; no alt on the GitHub choice | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | P4: the license passed is AGPL-3.0 only for GitHub with a public project | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | P4: the license passed is AGPL-3.0 only for GitHub with a public project | [1cd27f7] | --- @@ -217,3 +217,4 @@ destroy SR [OC-001]: ./oc.md [DCD-001]: ./dcd.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-001/ssd.md b/docs/uc-001/ssd.md index 8f8d466..596bcf7 100644 --- a/docs/uc-001/ssd.md +++ b/docs/uc-001/ssd.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | The license is not a parameter: it comes from config.env or follows the GitHub choice | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | The license that follows the GitHub choice also needs a public project | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | The license that follows the GitHub choice also needs a public project | [1cd27f7] | --- @@ -53,3 +53,4 @@ The system is one script run. It starts with the first operation and ends after [DM-001]: ./dm.md [OC-001]: ./oc.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-001/uc.md b/docs/uc-001/uc.md index 9b69016..7dbcad1 100644 --- a/docs/uc-001/uc.md +++ b/docs/uc-001/uc.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-06 | Proposed | Jens Tirsvad Nielsen | S02 | The license comes from PROJECT_LICENSE (step 6, extension 4c); AGPL-3.0 is only the default when GitHub is chosen | [d773fa9] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License rule: the AGPL-3.0 default needs GitHub and a public project (step 6, rule 6); step 9 and extension 9e fetch the framework's own submodules | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | License rule: the AGPL-3.0 default needs GitHub and a public project (step 6, rule 6); step 9 and extension 9e fetch the framework's own submodules | [1cd27f7] | --- @@ -105,3 +105,4 @@ [SA-001]: ../stakeholder-analysis.md [DM-001]: ./dm.md [d773fa9]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/d773fa91df5a54090254e12e074880fb6526a9ff +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-002/dcd.md b/docs/uc-002/dcd.md index 1008319..f24dc71 100644 --- a/docs/uc-002/dcd.md +++ b/docs/uc-002/dcd.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -85,3 +85,4 @@ The concept Command Link has no class: it is a link the Maintainer makes with th [UC-002]: ./uc.md [DCD-001]: ../uc-001/dcd.md [DCD-002]: ../dcd.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-002/dm.md b/docs/uc-002/dm.md index d6ac481..4d0d5f3 100644 --- a/docs/uc-002/dm.md +++ b/docs/uc-002/dm.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -82,3 +82,4 @@ WorkingFolder "1" --> "0..*" LocalProject : is the base of [DICT-001]: ../dictionary.md [DM-001]: ../uc-001/dm.md [DM-002]: ../domain-model.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-002/oc.md b/docs/uc-002/oc.md index fe537c0..c6c46c6 100644 --- a/docs/uc-002/oc.md +++ b/docs/uc-002/oc.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -51,3 +51,4 @@ Concepts below use the IT terms of [DICT-001] for the PO concepts of [DM-003]. ` [DM-003]: ./dm.md [DICT-001]: ../dictionary.md [OC-001]: ../uc-001/oc.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-002/sd.md b/docs/uc-002/sd.md index 46c65f9..d481059 100644 --- a/docs/uc-002/sd.md +++ b/docs/uc-002/sd.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -82,3 +82,4 @@ deactivate L [DCD-003]: ./dcd.md [DICT-001]: ../dictionary.md [SD-001]: ../uc-001/sd.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-002/ssd.md b/docs/uc-002/ssd.md index f704e56..8808a43 100644 --- a/docs/uc-002/ssd.md +++ b/docs/uc-002/ssd.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -48,3 +48,4 @@ One script run, as in [UC-001]. The command link persists between runs; the syst [UC-002]: ./uc.md [DM-003]: ./dm.md [OC-002]: ./oc.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/uc-002/uc.md b/docs/uc-002/uc.md index 81102c1..9a41f26 100644 --- a/docs/uc-002/uc.md +++ b/docs/uc-002/uc.md @@ -9,7 +9,7 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Initial version | [1cd27f7] | --- @@ -72,3 +72,4 @@ [US-001]: ../user-stories.md [SA-001]: ../stakeholder-analysis.md [BC-001]: ../business-case.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/use-case-diagram.md b/docs/use-case-diagram.md index 9248c8d..5747c67 100644 --- a/docs/use-case-diagram.md +++ b/docs/use-case-diagram.md @@ -10,7 +10,7 @@ | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | | 2026-10-05 | Accepted | Jens Tirsvad Nielsen | S02 | Initial version | [02875ae] | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added UC-002 Start the script as a global command (includes UC-001) | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added UC-002 Start the script as a global command (includes UC-001) | [1cd27f7] | --- @@ -62,3 +62,4 @@ UC2 ..> UC1 : <> [UC-001]: ./uc-001/uc.md [UC-002]: ./uc-002/uc.md [02875ae]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/02875aee5f2953473924074eea0056eb31af6b7a +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f diff --git a/docs/user-stories.md b/docs/user-stories.md index 66f599a..f98e287 100644 --- a/docs/user-stories.md +++ b/docs/user-stories.md @@ -9,8 +9,8 @@ ## Version History | Date | Status | Author | Reviewer | Change | Commit | | --- | --- | --- | --- | --- | --- | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | US-001.06: AGPL-3.0 default only for a public project with GitHub; US-001.07: the framework's own submodules (qc) are fetched | pending | -| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added US-002 (global command from the target folder) for UC-002 | pending | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | US-001.06: AGPL-3.0 default only for a public project with GitHub; US-001.07: the framework's own submodules (qc) are fetched | [1cd27f7] | +| 2026-10-07 | Proposed | Jens Tirsvad Nielsen | S02 | Added US-002 (global command from the target folder) for UC-002 | [1cd27f7] | --- @@ -164,3 +164,4 @@ Valuable, Negotiable, Estimable, Small and Testable hold for each story. Indepen [MIL-006]: ./milestones/mil-006-project-license.md [MIL-007]: ./milestones/mil-007-framework-checklists.md [PP-001]: ./project-plan.md +[1cd27f7]: https://git.tirsystem.com/TirSystem-BashScript/repo_foundry/commit/1cd27f77ed844773a969210a11de0d8bb98ac98f -- 2.54.0