ssot-cli 0.1.2__tar.gz → 0.1.4__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/PKG-INFO +15 -14
  2. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/README.md +6 -8
  3. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/pyproject.toml +9 -6
  4. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/adr_cmd.py +5 -1
  5. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/boundary_cmd.py +5 -1
  6. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/claim_cmd.py +5 -1
  7. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/evidence_cmd.py +5 -1
  8. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/feature_cmd.py +12 -3
  9. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/issue_cmd.py +5 -1
  10. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/main.py +1 -1
  11. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/profile_cmd.py +5 -1
  12. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/release_cmd.py +5 -1
  13. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/risk_cmd.py +5 -1
  14. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/spec_cmd.py +5 -1
  15. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/test_cmd.py +5 -1
  16. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli.egg-info/PKG-INFO +15 -14
  17. ssot_cli-0.1.4/src/ssot_cli.egg-info/requires.txt +5 -0
  18. ssot_cli-0.1.2/src/ssot_cli.egg-info/requires.txt +0 -5
  19. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/setup.cfg +0 -0
  20. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/__init__.py +0 -0
  21. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/common.py +0 -0
  22. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/graph_cmd.py +0 -0
  23. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/init_cmd.py +0 -0
  24. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/registry_cmd.py +0 -0
  25. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/upgrade_cmd.py +0 -0
  26. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli/validate_cmd.py +0 -0
  27. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli.egg-info/SOURCES.txt +0 -0
  28. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli.egg-info/dependency_links.txt +0 -0
  29. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli.egg-info/entry_points.txt +0 -0
  30. {ssot_cli-0.1.2 → ssot_cli-0.1.4}/src/ssot_cli.egg-info/top_level.txt +0 -0
@@ -1,16 +1,17 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ssot-cli
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Primary CLI distribution for ssot-registry.
5
5
  Author-email: Jacob Stewart <jacob@swarmauri.com>
6
6
  License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/groupsum/ssot-registry
8
- Project-URL: Repository, https://github.com/groupsum/ssot-registry
7
+ Project-URL: Homepage, https://github.com/groupsum/ssot-registry/tree/main/pkgs/ssot-cli
8
+ Project-URL: Repository, https://github.com/groupsum/ssot-registry/tree/main/pkgs/ssot-cli
9
9
  Project-URL: Issues, https://github.com/groupsum/ssot-registry/issues
10
- Keywords: ssot,cli,registry
10
+ Keywords: ssot,cli,registry,governance,release-management,validation,developer-tools
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Information Technology
14
15
  Classifier: Operating System :: OS Independent
15
16
  Classifier: Programming Language :: Python :: 3
16
17
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -18,11 +19,13 @@ Classifier: Programming Language :: Python :: 3.10
18
19
  Classifier: Programming Language :: Python :: 3.11
19
20
  Classifier: Programming Language :: Python :: 3.12
20
21
  Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Software Development :: Documentation
23
+ Classifier: Topic :: Software Development :: Quality Assurance
21
24
  Classifier: Topic :: Utilities
22
25
  Requires-Python: <3.14,>=3.10
23
26
  Description-Content-Type: text/markdown
24
- Requires-Dist: ssot-contracts<0.3.0,>=0.2.6
25
- Requires-Dist: ssot-registry<0.3.0,>=0.2.6
27
+ Requires-Dist: ssot-contracts<0.3.0,>=0.2.8
28
+ Requires-Dist: ssot-core<0.3.0,>=0.2.8
26
29
  Requires-Dist: tomli>=2.0.1; python_version < "3.11"
27
30
 
28
31
  <div align="center">
@@ -39,7 +42,7 @@ Requires-Dist: tomli>=2.0.1; python_version < "3.11"
39
42
 
40
43
  `ssot-cli` is the primary command-line distribution for SSOT.
41
44
 
42
- It installs `ssot`, `ssot-cli`, and `ssot-registry` as equivalent executables over the same parser and runtime. The command surface is implemented here, while domain logic lives in `ssot-registry` and shared contract metadata comes from `ssot-contracts`.
45
+ It installs `ssot`, `ssot-cli`, and `ssot-registry` as equivalent executables over the same parser and runtime. The command surface is implemented here, while domain logic lives in [ssot-core](https://pypi.org/project/ssot-core/) and shared contract metadata comes from [ssot-contracts](https://pypi.org/project/ssot-contracts/).
43
46
 
44
47
  - GitHub: https://github.com/groupsum/ssot-registry
45
48
 
@@ -61,7 +64,7 @@ For local development:
61
64
  python -m pip install -e pkgs/ssot-cli
62
65
  ```
63
66
 
64
- This package depends on `ssot-registry` and `ssot-contracts`, so installing it gives you the full CLI runtime stack.
67
+ This package depends on [ssot-core](https://pypi.org/project/ssot-core/) and [ssot-contracts](https://pypi.org/project/ssot-contracts/), so installing it gives you the full CLI runtime stack.
65
68
 
66
69
  ## Executable names
67
70
 
@@ -99,13 +102,11 @@ ssot registry --help
99
102
 
100
103
  Regenerate these assets with `python scripts/generate_cli_screenshots.py`.
101
104
 
102
- Top-level command help:
103
-
104
- ![ssot top-level help](assets/ssot-cli-help.png)
105
+ ![ssot top-level help](https://raw.githubusercontent.com/groupsum/ssot-registry/main/pkgs/ssot-cli/assets/ssot-cli-help.png)
105
106
 
106
107
  Boundary command help:
107
108
 
108
- ![ssot boundary help](assets/ssot-cli-boundary-help.svg)
109
+ ![ssot boundary help](https://raw.githubusercontent.com/groupsum/ssot-registry/main/pkgs/ssot-cli/assets/ssot-cli-boundary-help.png)
109
110
 
110
111
  ## CLI conventions
111
112
 
@@ -822,7 +823,7 @@ ssot release certify . --release-id rel:0.1.0 --write-report
822
823
  ## Package relationships
823
824
 
824
825
  - Package type: CLI distribution
825
- - Depends on: `ssot-registry`, `ssot-contracts`
826
- - Related packages: `ssot-tui`, `ssot-views`, `ssot-codegen`
826
+ - Depends on: [ssot-core](https://pypi.org/project/ssot-core/), [ssot-contracts](https://pypi.org/project/ssot-contracts/)
827
+ - Related packages: [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), [ssot-codegen](https://pypi.org/project/ssot-codegen/)
827
828
 
828
829
  If you need the command-line interface, this is the package to install.
@@ -12,7 +12,7 @@
12
12
 
13
13
  `ssot-cli` is the primary command-line distribution for SSOT.
14
14
 
15
- It installs `ssot`, `ssot-cli`, and `ssot-registry` as equivalent executables over the same parser and runtime. The command surface is implemented here, while domain logic lives in `ssot-registry` and shared contract metadata comes from `ssot-contracts`.
15
+ It installs `ssot`, `ssot-cli`, and `ssot-registry` as equivalent executables over the same parser and runtime. The command surface is implemented here, while domain logic lives in [ssot-core](https://pypi.org/project/ssot-core/) and shared contract metadata comes from [ssot-contracts](https://pypi.org/project/ssot-contracts/).
16
16
 
17
17
  - GitHub: https://github.com/groupsum/ssot-registry
18
18
 
@@ -34,7 +34,7 @@ For local development:
34
34
  python -m pip install -e pkgs/ssot-cli
35
35
  ```
36
36
 
37
- This package depends on `ssot-registry` and `ssot-contracts`, so installing it gives you the full CLI runtime stack.
37
+ This package depends on [ssot-core](https://pypi.org/project/ssot-core/) and [ssot-contracts](https://pypi.org/project/ssot-contracts/), so installing it gives you the full CLI runtime stack.
38
38
 
39
39
  ## Executable names
40
40
 
@@ -72,13 +72,11 @@ ssot registry --help
72
72
 
73
73
  Regenerate these assets with `python scripts/generate_cli_screenshots.py`.
74
74
 
75
- Top-level command help:
76
-
77
- ![ssot top-level help](assets/ssot-cli-help.png)
75
+ ![ssot top-level help](https://raw.githubusercontent.com/groupsum/ssot-registry/main/pkgs/ssot-cli/assets/ssot-cli-help.png)
78
76
 
79
77
  Boundary command help:
80
78
 
81
- ![ssot boundary help](assets/ssot-cli-boundary-help.svg)
79
+ ![ssot boundary help](https://raw.githubusercontent.com/groupsum/ssot-registry/main/pkgs/ssot-cli/assets/ssot-cli-boundary-help.png)
82
80
 
83
81
  ## CLI conventions
84
82
 
@@ -795,7 +793,7 @@ ssot release certify . --release-id rel:0.1.0 --write-report
795
793
  ## Package relationships
796
794
 
797
795
  - Package type: CLI distribution
798
- - Depends on: `ssot-registry`, `ssot-contracts`
799
- - Related packages: `ssot-tui`, `ssot-views`, `ssot-codegen`
796
+ - Depends on: [ssot-core](https://pypi.org/project/ssot-core/), [ssot-contracts](https://pypi.org/project/ssot-contracts/)
797
+ - Related packages: [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), [ssot-codegen](https://pypi.org/project/ssot-codegen/)
800
798
 
801
799
  If you need the command-line interface, this is the package to install.
@@ -4,22 +4,23 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "ssot-cli"
7
- version = "0.1.2"
7
+ version = "0.1.4"
8
8
  description = "Primary CLI distribution for ssot-registry."
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.10,<3.14"
11
11
  license = "Apache-2.0"
12
12
  authors = [{ name = "Jacob Stewart", email = "jacob@swarmauri.com" }]
13
13
  dependencies = [
14
- "ssot-contracts>=0.2.6,<0.3.0",
15
- "ssot-registry>=0.2.6,<0.3.0",
14
+ "ssot-contracts>=0.2.8,<0.3.0",
15
+ "ssot-core>=0.2.8,<0.3.0",
16
16
  "tomli>=2.0.1; python_version < '3.11'",
17
17
  ]
18
- keywords = ["ssot", "cli", "registry"]
18
+ keywords = ["ssot", "cli", "registry", "governance", "release-management", "validation", "developer-tools"]
19
19
  classifiers = [
20
20
  "Development Status :: 3 - Alpha",
21
21
  "Environment :: Console",
22
22
  "Intended Audience :: Developers",
23
+ "Intended Audience :: Information Technology",
23
24
  "Operating System :: OS Independent",
24
25
  "Programming Language :: Python :: 3",
25
26
  "Programming Language :: Python :: 3 :: Only",
@@ -27,12 +28,14 @@ classifiers = [
27
28
  "Programming Language :: Python :: 3.11",
28
29
  "Programming Language :: Python :: 3.12",
29
30
  "Programming Language :: Python :: 3.13",
31
+ "Topic :: Software Development :: Documentation",
32
+ "Topic :: Software Development :: Quality Assurance",
30
33
  "Topic :: Utilities",
31
34
  ]
32
35
 
33
36
  [project.urls]
34
- Homepage = "https://github.com/groupsum/ssot-registry"
35
- Repository = "https://github.com/groupsum/ssot-registry"
37
+ Homepage = "https://github.com/groupsum/ssot-registry/tree/main/pkgs/ssot-cli"
38
+ Repository = "https://github.com/groupsum/ssot-registry/tree/main/pkgs/ssot-cli"
36
39
  Issues = "https://github.com/groupsum/ssot-registry/issues"
37
40
 
38
41
  [project.scripts]
@@ -18,7 +18,11 @@ from ssot_cli.common import add_path_argument, compact_dict
18
18
 
19
19
 
20
20
  def register_adr(subparsers: argparse._SubParsersAction) -> None:
21
- adr = subparsers.add_parser("adr", help="ADR operations.")
21
+ adr = subparsers.add_parser(
22
+ "adr",
23
+ help="ADR operations.",
24
+ description="Architectural decision records capture why the system is designed the way it is and preserve decision history.",
25
+ )
22
26
  adr_sub = adr.add_subparsers(dest="adr_command", required=True)
23
27
 
24
28
  create = adr_sub.add_parser("create", help="Create an ADR.")
@@ -18,7 +18,11 @@ from ssot_cli.common import add_optional_bool_argument, add_path_argument, compa
18
18
 
19
19
 
20
20
  def register_boundary(subparsers: argparse._SubParsersAction) -> None:
21
- boundary = subparsers.add_parser("boundary", help="Boundary operations.")
21
+ boundary = subparsers.add_parser(
22
+ "boundary",
23
+ help="Boundary operations.",
24
+ description="Boundaries define the scoped set of direct features and reusable profiles that a release is evaluated against.",
25
+ )
22
26
  boundary_sub = boundary.add_subparsers(dest="boundary_command", required=True)
23
27
 
24
28
  create = boundary_sub.add_parser("create", help="Create a boundary.")
@@ -25,7 +25,11 @@ _LINK_MAPPING = {
25
25
 
26
26
 
27
27
  def register_claim(subparsers: argparse._SubParsersAction) -> None:
28
- claim = subparsers.add_parser("claim", help="Claim operations.")
28
+ claim = subparsers.add_parser(
29
+ "claim",
30
+ help="Claim operations.",
31
+ description="Claims are tiered statements about feature behavior that are backed by tests and evidence over time.",
32
+ )
29
33
  claim_sub = claim.add_subparsers(dest="claim_command", required=True)
30
34
 
31
35
  create = claim_sub.add_parser("create", help="Create a claim.")
@@ -22,7 +22,11 @@ _LINK_MAPPING = {
22
22
 
23
23
 
24
24
  def register_evidence(subparsers: argparse._SubParsersAction) -> None:
25
- evidence = subparsers.add_parser("evidence", help="Evidence operations.")
25
+ evidence = subparsers.add_parser(
26
+ "evidence",
27
+ help="Evidence operations.",
28
+ description="Evidence rows track artifacts that support claims and test outcomes, such as bundles, logs, or reports.",
29
+ )
26
30
  evidence_sub = evidence.add_subparsers(dest="evidence_command", required=True)
27
31
 
28
32
  create = evidence_sub.add_parser("create", help="Create an evidence row.")
@@ -18,6 +18,7 @@ from ssot_cli.common import add_optional_bool_argument, add_path_argument, colle
18
18
 
19
19
 
20
20
  _LINK_MAPPING = {
21
+ "spec_ids": "spec_ids",
21
22
  "claim_ids": "claim_ids",
22
23
  "test_ids": "test_ids",
23
24
  "requires": "requires",
@@ -25,7 +26,11 @@ _LINK_MAPPING = {
25
26
 
26
27
 
27
28
  def register_feature(subparsers: argparse._SubParsersAction) -> None:
28
- feature = subparsers.add_parser("feature", help="Feature operations.")
29
+ feature = subparsers.add_parser(
30
+ "feature",
31
+ help="Feature operations.",
32
+ description="Features are targetable implementation units that connect planning, claims, tests, and supporting specs.",
33
+ )
29
34
  feature_sub = feature.add_subparsers(dest="feature_command", required=True)
30
35
 
31
36
  create = feature_sub.add_parser("create", help="Create a feature.")
@@ -41,6 +46,7 @@ def register_feature(subparsers: argparse._SubParsersAction) -> None:
41
46
  create.add_argument("--claim-tier", choices=sorted(CLAIM_TIERS), default=None)
42
47
  create.add_argument("--target-lifecycle-stage", choices=sorted(FEATURE_LIFECYCLE_STAGES), default="active")
43
48
  create.add_argument("--slot", default=None)
49
+ create.add_argument("--spec-ids", nargs="*", default=[])
44
50
  create.add_argument("--claim-ids", nargs="*", default=[])
45
51
  create.add_argument("--test-ids", nargs="*", default=[])
46
52
  create.add_argument("--requires", nargs="*", default=[])
@@ -68,17 +74,19 @@ def register_feature(subparsers: argparse._SubParsersAction) -> None:
68
74
  delete.add_argument("--id", required=True)
69
75
  delete.set_defaults(func=run_delete)
70
76
 
71
- link = feature_sub.add_parser("link", help="Link a feature to claims, tests, or required features.")
77
+ link = feature_sub.add_parser("link", help="Link a feature to specs, claims, tests, or required features.")
72
78
  add_path_argument(link)
73
79
  link.add_argument("--id", required=True)
80
+ link.add_argument("--spec-ids", nargs="*")
74
81
  link.add_argument("--claim-ids", nargs="*")
75
82
  link.add_argument("--test-ids", nargs="*")
76
83
  link.add_argument("--requires", nargs="*")
77
84
  link.set_defaults(func=run_link)
78
85
 
79
- unlink = feature_sub.add_parser("unlink", help="Unlink a feature from claims, tests, or required features.")
86
+ unlink = feature_sub.add_parser("unlink", help="Unlink a feature from specs, claims, tests, or required features.")
80
87
  add_path_argument(unlink)
81
88
  unlink.add_argument("--id", required=True)
89
+ unlink.add_argument("--spec-ids", nargs="*")
82
90
  unlink.add_argument("--claim-ids", nargs="*")
83
91
  unlink.add_argument("--test-ids", nargs="*")
84
92
  unlink.add_argument("--requires", nargs="*")
@@ -139,6 +147,7 @@ def run_create(args: argparse.Namespace) -> dict[str, object]:
139
147
  "target_claim_tier": args.claim_tier,
140
148
  "target_lifecycle_stage": args.target_lifecycle_stage,
141
149
  },
150
+ "spec_ids": args.spec_ids,
142
151
  "claim_ids": args.claim_ids,
143
152
  "test_ids": args.test_ids,
144
153
  "requires": args.requires,
@@ -26,7 +26,11 @@ _LINK_MAPPING = {
26
26
 
27
27
 
28
28
  def register_issue(subparsers: argparse._SubParsersAction) -> None:
29
- issue = subparsers.add_parser("issue", help="Issue operations.")
29
+ issue = subparsers.add_parser(
30
+ "issue",
31
+ help="Issue operations.",
32
+ description="Issues are plannable problem records that can block releases and link to affected features, claims, tests, evidence, and risks.",
33
+ )
30
34
  issue_sub = issue.add_subparsers(dest="issue_command", required=True)
31
35
 
32
36
  create = issue_sub.add_parser("create", help="Create an issue.")
@@ -39,7 +39,7 @@ def _default_prog() -> str:
39
39
  def build_parser(*, prog: str | None = None) -> argparse.ArgumentParser:
40
40
  parser = argparse.ArgumentParser(
41
41
  prog=prog or _default_prog(),
42
- description="Portable single-source-of-truth registry for features, tests, claims, evidence, issues, risks, boundaries, and releases.",
42
+ description="Portable single-source-of-truth registry for features, profiles, tests, claims, evidence, issues, risks, boundaries, releases, ADRs, and SPECs.",
43
43
  )
44
44
  parser.add_argument("--output-format", default="json", choices=OUTPUT_FORMATS, help="CLI output format.")
45
45
  parser.add_argument("--output-file", default=None, help="Optional file to write the rendered command output.")
@@ -21,7 +21,11 @@ _LINK_MAPPING = {
21
21
 
22
22
 
23
23
  def register_profile(subparsers: argparse._SubParsersAction) -> None:
24
- profile = subparsers.add_parser("profile", help="Profile operations.")
24
+ profile = subparsers.add_parser(
25
+ "profile",
26
+ help="Profile operations.",
27
+ description="Profiles are reusable bundles of features and nested profiles used for capability, certification, deployment, or interoperability scopes.",
28
+ )
25
29
  profile_sub = profile.add_subparsers(dest="profile_command", required=True)
26
30
 
27
31
  create = profile_sub.add_parser("create", help="Create a profile.")
@@ -21,7 +21,11 @@ from ssot_cli.common import add_path_argument, compact_dict
21
21
 
22
22
 
23
23
  def register_release(subparsers: argparse._SubParsersAction) -> None:
24
- release = subparsers.add_parser("release", help="Release operations.")
24
+ release = subparsers.add_parser(
25
+ "release",
26
+ help="Release operations.",
27
+ description="Releases are publication units tied to a boundary and the claims and evidence required for certification, promotion, and publication.",
28
+ )
25
29
  release_sub = release.add_subparsers(dest="release_command", required=True)
26
30
 
27
31
  create = release_sub.add_parser("create", help="Create a release.")
@@ -25,7 +25,11 @@ _LINK_MAPPING = {
25
25
 
26
26
 
27
27
  def register_risk(subparsers: argparse._SubParsersAction) -> None:
28
- risk = subparsers.add_parser("risk", help="Risk operations.")
28
+ risk = subparsers.add_parser(
29
+ "risk",
30
+ help="Risk operations.",
31
+ description="Risks capture active or accepted exposure tied to related features, claims, tests, evidence, and issues.",
32
+ )
29
33
  risk_sub = risk.add_subparsers(dest="risk_command", required=True)
30
34
 
31
35
  create = risk_sub.add_parser("create", help="Create a risk.")
@@ -18,7 +18,11 @@ from ssot_cli.common import add_path_argument, compact_dict
18
18
 
19
19
 
20
20
  def register_spec(subparsers: argparse._SubParsersAction) -> None:
21
- spec = subparsers.add_parser("spec", help="Spec operations.")
21
+ spec = subparsers.add_parser(
22
+ "spec",
23
+ help="Spec operations.",
24
+ description="SPEC documents define normative or operational contract that repositories are expected to satisfy.",
25
+ )
22
26
  spec_sub = spec.add_subparsers(dest="spec_command", required=True)
23
27
 
24
28
  create = spec_sub.add_parser("create", help="Create a spec.")
@@ -14,7 +14,11 @@ _LINK_MAPPING = {
14
14
 
15
15
 
16
16
  def register_test(subparsers: argparse._SubParsersAction) -> None:
17
- test = subparsers.add_parser("test", help="Test operations.")
17
+ test = subparsers.add_parser(
18
+ "test",
19
+ help="Test operations.",
20
+ description="Tests are executable or planned verification rows linked to features, claims, and evidence.",
21
+ )
18
22
  test_sub = test.add_subparsers(dest="test_command", required=True)
19
23
 
20
24
  create = test_sub.add_parser("create", help="Create a test.")
@@ -1,16 +1,17 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: ssot-cli
3
- Version: 0.1.2
3
+ Version: 0.1.4
4
4
  Summary: Primary CLI distribution for ssot-registry.
5
5
  Author-email: Jacob Stewart <jacob@swarmauri.com>
6
6
  License-Expression: Apache-2.0
7
- Project-URL: Homepage, https://github.com/groupsum/ssot-registry
8
- Project-URL: Repository, https://github.com/groupsum/ssot-registry
7
+ Project-URL: Homepage, https://github.com/groupsum/ssot-registry/tree/main/pkgs/ssot-cli
8
+ Project-URL: Repository, https://github.com/groupsum/ssot-registry/tree/main/pkgs/ssot-cli
9
9
  Project-URL: Issues, https://github.com/groupsum/ssot-registry/issues
10
- Keywords: ssot,cli,registry
10
+ Keywords: ssot,cli,registry,governance,release-management,validation,developer-tools
11
11
  Classifier: Development Status :: 3 - Alpha
12
12
  Classifier: Environment :: Console
13
13
  Classifier: Intended Audience :: Developers
14
+ Classifier: Intended Audience :: Information Technology
14
15
  Classifier: Operating System :: OS Independent
15
16
  Classifier: Programming Language :: Python :: 3
16
17
  Classifier: Programming Language :: Python :: 3 :: Only
@@ -18,11 +19,13 @@ Classifier: Programming Language :: Python :: 3.10
18
19
  Classifier: Programming Language :: Python :: 3.11
19
20
  Classifier: Programming Language :: Python :: 3.12
20
21
  Classifier: Programming Language :: Python :: 3.13
22
+ Classifier: Topic :: Software Development :: Documentation
23
+ Classifier: Topic :: Software Development :: Quality Assurance
21
24
  Classifier: Topic :: Utilities
22
25
  Requires-Python: <3.14,>=3.10
23
26
  Description-Content-Type: text/markdown
24
- Requires-Dist: ssot-contracts<0.3.0,>=0.2.6
25
- Requires-Dist: ssot-registry<0.3.0,>=0.2.6
27
+ Requires-Dist: ssot-contracts<0.3.0,>=0.2.8
28
+ Requires-Dist: ssot-core<0.3.0,>=0.2.8
26
29
  Requires-Dist: tomli>=2.0.1; python_version < "3.11"
27
30
 
28
31
  <div align="center">
@@ -39,7 +42,7 @@ Requires-Dist: tomli>=2.0.1; python_version < "3.11"
39
42
 
40
43
  `ssot-cli` is the primary command-line distribution for SSOT.
41
44
 
42
- It installs `ssot`, `ssot-cli`, and `ssot-registry` as equivalent executables over the same parser and runtime. The command surface is implemented here, while domain logic lives in `ssot-registry` and shared contract metadata comes from `ssot-contracts`.
45
+ It installs `ssot`, `ssot-cli`, and `ssot-registry` as equivalent executables over the same parser and runtime. The command surface is implemented here, while domain logic lives in [ssot-core](https://pypi.org/project/ssot-core/) and shared contract metadata comes from [ssot-contracts](https://pypi.org/project/ssot-contracts/).
43
46
 
44
47
  - GitHub: https://github.com/groupsum/ssot-registry
45
48
 
@@ -61,7 +64,7 @@ For local development:
61
64
  python -m pip install -e pkgs/ssot-cli
62
65
  ```
63
66
 
64
- This package depends on `ssot-registry` and `ssot-contracts`, so installing it gives you the full CLI runtime stack.
67
+ This package depends on [ssot-core](https://pypi.org/project/ssot-core/) and [ssot-contracts](https://pypi.org/project/ssot-contracts/), so installing it gives you the full CLI runtime stack.
65
68
 
66
69
  ## Executable names
67
70
 
@@ -99,13 +102,11 @@ ssot registry --help
99
102
 
100
103
  Regenerate these assets with `python scripts/generate_cli_screenshots.py`.
101
104
 
102
- Top-level command help:
103
-
104
- ![ssot top-level help](assets/ssot-cli-help.png)
105
+ ![ssot top-level help](https://raw.githubusercontent.com/groupsum/ssot-registry/main/pkgs/ssot-cli/assets/ssot-cli-help.png)
105
106
 
106
107
  Boundary command help:
107
108
 
108
- ![ssot boundary help](assets/ssot-cli-boundary-help.svg)
109
+ ![ssot boundary help](https://raw.githubusercontent.com/groupsum/ssot-registry/main/pkgs/ssot-cli/assets/ssot-cli-boundary-help.png)
109
110
 
110
111
  ## CLI conventions
111
112
 
@@ -822,7 +823,7 @@ ssot release certify . --release-id rel:0.1.0 --write-report
822
823
  ## Package relationships
823
824
 
824
825
  - Package type: CLI distribution
825
- - Depends on: `ssot-registry`, `ssot-contracts`
826
- - Related packages: `ssot-tui`, `ssot-views`, `ssot-codegen`
826
+ - Depends on: [ssot-core](https://pypi.org/project/ssot-core/), [ssot-contracts](https://pypi.org/project/ssot-contracts/)
827
+ - Related packages: [ssot-registry](https://pypi.org/project/ssot-registry/), [ssot-tui](https://pypi.org/project/ssot-tui/), [ssot-views](https://pypi.org/project/ssot-views/), [ssot-codegen](https://pypi.org/project/ssot-codegen/)
827
828
 
828
829
  If you need the command-line interface, this is the package to install.
@@ -0,0 +1,5 @@
1
+ ssot-contracts<0.3.0,>=0.2.8
2
+ ssot-core<0.3.0,>=0.2.8
3
+
4
+ [:python_version < "3.11"]
5
+ tomli>=2.0.1
@@ -1,5 +0,0 @@
1
- ssot-contracts<0.3.0,>=0.2.6
2
- ssot-registry<0.3.0,>=0.2.6
3
-
4
- [:python_version < "3.11"]
5
- tomli>=2.0.1
File without changes