caste 0.1.1__cp314-cp314t-musllinux_1_2_x86_64.whl

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.
caste/__init__.py ADDED
@@ -0,0 +1,15 @@
1
+ """
2
+ Opinionated hardware classification library.
3
+
4
+ Caste inspects a user's machine and assigns it to a practical hardware category
5
+ (Mini, User, Developer, Workstation, or Rig) to help set sensible application defaults.
6
+ """
7
+
8
+ from ._caste import __version__, detect_caste, detect_caste_word, detect_hw_facts
9
+
10
+ __all__ = [
11
+ "__version__",
12
+ "detect_caste",
13
+ "detect_caste_word",
14
+ "detect_hw_facts",
15
+ ]
@@ -0,0 +1,74 @@
1
+ Metadata-Version: 2.4
2
+ Name: caste
3
+ Version: 0.1.1
4
+ Summary: Opinionated hardware classification library.
5
+ Keywords: hardware,classification,system-info,gpu,cpu
6
+ Author-Email: Zeth <holdercardteam+caste@gmail.com>
7
+ License-Expression: MIT
8
+ Project-URL: Repository, https://github.com/zeth/caste
9
+ Project-URL: Issues, https://github.com/zeth/caste/issues
10
+ Requires-Python: >=3.8
11
+ Provides-Extra: test
12
+ Requires-Dist: pytest; extra == "test"
13
+ Description-Content-Type: text/markdown
14
+
15
+ # caste - T-Shirt sizes for hardware
16
+
17
+ Opinionated hardware classification library for Python.
18
+
19
+ `caste` is a deliberately simple library that inspects a user’s machine and assigns it to a small, practical "hardware caste" (like Mini, User, or Developer). This helps you set sensible defaults for your application based on the user's hardware without manually parsing RAM, CPU, and GPU stats.
20
+
21
+ ## Installation
22
+
23
+ ```bash
24
+ pip install caste
25
+ ```
26
+
27
+ ## Quick Start
28
+
29
+ ```python
30
+ import caste
31
+
32
+ # Get a simple one-word label for the machine
33
+ print(caste.detect_caste_word()) # e.g., "User"
34
+
35
+ # Get the label and the reason for the classification
36
+ label, reason = caste.detect_caste()
37
+ print(f"Caste: {label} (Reason: {reason})")
38
+
39
+ # Get raw hardware facts if you want to perform your own logic
40
+ facts = caste.detect_hw_facts()
41
+ print(f"RAM: {facts['ram_bytes'] / 1024**3:.1f} GB")
42
+ print(f"Discrete GPU: {facts['has_discrete_gpu']}")
43
+ ```
44
+
45
+ ## Hardware Castes
46
+
47
+ - **Mini** — Microcomputers, embedded systems, classic/legacy PCs.
48
+ - **User** — Standard consumer-level machines.
49
+ - **Developer** — High-end personal computers.
50
+ - **Workstation** — Professional content-creation or high-end gaming machines.
51
+ - **Rig** — Dedicated servers or specialised compute systems.
52
+
53
+ ## API Reference
54
+
55
+ `detect_hw_facts()` returns a dictionary with:
56
+
57
+ - `ram_bytes` (int)
58
+ - `physical_cores` (int)
59
+ - `logical_threads` (int)
60
+ - `gpu_kind` (0=None, 1=Integrated, 2=Unified, 3=Discrete)
61
+ - `vram_bytes` (int)
62
+ - `has_discrete_gpu` (bool)
63
+ - `is_apple_silicon` (bool)
64
+ - `is_intel_arc` (bool)
65
+
66
+ ## Why use caste?
67
+
68
+ Modern applications often launch with no idea of the underlying hardware capability. If defaults are tuned only for a developer’s machine, it can lead to sluggish experiences on low-end hardware or not showing off your apps's best capabilities on high-end systems. `caste` provides a standardized way to bridge this gap.
69
+
70
+ There is also a C++ library and an executable for shell scripts and build systems. See the Github repo for details.
71
+
72
+ ## License
73
+
74
+ MIT
@@ -0,0 +1,16 @@
1
+ caste/__init__.py,sha256=MJlHCvtpkMulHvGIqMeEkJgrOXMflPvZzDem-AONXc4,407
2
+ caste/_caste.cpython-314t-x86_64-linux-musl.so,sha256=NfYZ3zr45VhkZwDelpp4XsYcTQJSNRxWv05DzU1Hyhw,196113
3
+ caste.libs/libgcc_s-0cd532bd.so.1,sha256=yPk0-VjyKzucjnkP3mvC0vVaua6Ln17qZUJbICcXgtA,181737
4
+ caste.libs/libstdc++-5d72f927.so.6.0.33,sha256=fogxHsmB1_D6C-a_-uHh8Ei_6Qh52a8vLlicJRM3ehk,3562401
5
+ include/caste/caste.hpp,sha256=3SWO24J59dRG9LtHh6YgvI4dxT9Tvjd0iP8CKVoJE-E,1304
6
+ lib/libcaste.a,sha256=FbLVHyfiw6bskHmprW3QRQYBJ6uh3yCNy1UiEoO2IKs,56516
7
+ lib/cmake/caste/casteConfig.cmake,sha256=MQiqwhWln2NUUXYSsuqkWIKqGo3JG9YaSEMUfXeNRFc,935
8
+ lib/cmake/caste/casteConfigVersion.cmake,sha256=REDN-rfH5OT__PDYHWmPzYApDE8qjTLE-CQpk7CvlR0,2762
9
+ lib/cmake/caste/casteTargets-release.cmake,sha256=azYExIX60eoPQgJMl-jRHxYePK5kucetIOrQU4EypPs,831
10
+ lib/cmake/caste/casteTargets.cmake,sha256=cAshrk68d0y6rXuzWbfYMqO2z7NeV1itor8VmA6oW0U,4187
11
+ share/doc/caste/LICENSE,sha256=nKZjaL__KpJTeJioBnR2Np2AAxZkH8R1DTXjhFRJ1IA,1061
12
+ share/man/man1/caste.1,sha256=tijtiabbdGwW5nVGm6vIC5wsHVT5l8q7oDY5IlNiOVE,690
13
+ caste-0.1.1.dist-info/METADATA,sha256=E-hForFUoAKWWaVn0wXsBSw595c63_QylMhr7RpqviM,2496
14
+ caste-0.1.1.dist-info/WHEEL,sha256=oFZwGhZ-72JyRhgBdV-DnUxYsudkzCAOQV7iA_6nKWA,118
15
+ caste-0.1.1.dist-info/RECORD,,
16
+ caste-0.1.1.dist-info/sboms/auditwheel.cdx.json,sha256=0jHXpEJkFSfWsER0deGSQr7WXaGMs-CQnGl5qP6NIEQ,1659
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: scikit-build-core 0.11.6
3
+ Root-Is-Purelib: false
4
+ Tag: cp314-cp314t-musllinux_1_2_x86_64
5
+
@@ -0,0 +1 @@
1
+ {"bomFormat": "CycloneDX", "specVersion": "1.4", "version": 1, "metadata": {"component": {"type": "library", "bom-ref": "pkg:pypi/caste@0.1.1?file_name=caste-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", "name": "caste", "version": "0.1.1", "purl": "pkg:pypi/caste@0.1.1?file_name=caste-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl"}, "tools": [{"name": "auditwheel", "version": "6.6.0"}]}, "components": [{"type": "library", "bom-ref": "pkg:pypi/caste@0.1.1?file_name=caste-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", "name": "caste", "version": "0.1.1", "purl": "pkg:pypi/caste@0.1.1?file_name=caste-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl"}, {"type": "library", "bom-ref": "pkg:apk/alpine/libgcc@14.2.0-r6#933a623c9e323e83b1734e630a342f206999adc096732a3fea9896fa0181ea29", "name": "libgcc", "version": "14.2.0-r6", "purl": "pkg:apk/alpine/libgcc@14.2.0-r6"}, {"type": "library", "bom-ref": "pkg:apk/alpine/libstdc%2B%2B@14.2.0-r6#76f023cbc3d7b369d6008f354e88aa983d13e4bd8f06e4e49a01686039fe1509", "name": "libstdc++", "version": "14.2.0-r6", "purl": "pkg:apk/alpine/libstdc%2B%2B@14.2.0-r6"}], "dependencies": [{"ref": "pkg:pypi/caste@0.1.1?file_name=caste-0.1.1-cp314-cp314t-musllinux_1_2_x86_64.whl", "dependsOn": ["pkg:apk/alpine/libgcc@14.2.0-r6#933a623c9e323e83b1734e630a342f206999adc096732a3fea9896fa0181ea29", "pkg:apk/alpine/libstdc%2B%2B@14.2.0-r6#76f023cbc3d7b369d6008f354e88aa983d13e4bd8f06e4e49a01686039fe1509"]}, {"ref": "pkg:apk/alpine/libgcc@14.2.0-r6#933a623c9e323e83b1734e630a342f206999adc096732a3fea9896fa0181ea29"}, {"ref": "pkg:apk/alpine/libstdc%2B%2B@14.2.0-r6#76f023cbc3d7b369d6008f354e88aa983d13e4bd8f06e4e49a01686039fe1509"}]}
Binary file
Binary file
@@ -0,0 +1,48 @@
1
+ #pragma once
2
+
3
+ #include <cstdint>
4
+ #include <string>
5
+
6
+ enum class Caste {
7
+ Mini,
8
+ User,
9
+ Developer,
10
+ Workstation,
11
+ Rig
12
+ };
13
+
14
+ enum class GpuKind {
15
+ None,
16
+ Integrated, // Intel UHD/Iris Xe, AMD iGPU, etc. (shared memory)
17
+ Unified, // Apple Silicon style unified memory (shared, but fast)
18
+ Discrete // NVIDIA/AMD dGPU with dedicated VRAM
19
+ };
20
+
21
+ struct HwFacts {
22
+ // Memory
23
+ uint64_t ram_bytes = 0;
24
+
25
+ // CPU (use whatever you can get; physical if known, else set to 0)
26
+ int physical_cores = 0;
27
+ int logical_threads = 0;
28
+
29
+ // GPU summary (your detection layer fills this)
30
+ GpuKind gpu_kind = GpuKind::None;
31
+ uint64_t vram_bytes = 0; // only meaningful if gpu_kind == Discrete
32
+ bool has_discrete_gpu = false; // convenience (often same as gpu_kind==Discrete)
33
+ bool is_apple_silicon = false; // macOS arm64
34
+ bool is_intel_arc = false; // Arc dGPU OR Arc-class iGPU (your detection decides)
35
+ };
36
+
37
+ struct CasteResult {
38
+ Caste caste = Caste::Mini;
39
+ std::string reason; // for logs/UI
40
+ };
41
+
42
+ CasteResult classify_caste(const HwFacts& hw);
43
+ const char* caste_name(Caste t);
44
+
45
+ // Simple public API: call this and get a single word bucket name.
46
+ HwFacts detect_hw_facts();
47
+ CasteResult detect_caste();
48
+ std::string detect_caste_word();
@@ -0,0 +1,27 @@
1
+
2
+ ####### Expanded from @PACKAGE_INIT@ by configure_package_config_file() #######
3
+ ####### Any changes to this file will be overwritten by the next CMake run ####
4
+ ####### The input file was casteConfig.cmake.in ########
5
+
6
+ get_filename_component(PACKAGE_PREFIX_DIR "${CMAKE_CURRENT_LIST_DIR}/../../../" ABSOLUTE)
7
+
8
+ macro(set_and_check _var _file)
9
+ set(${_var} "${_file}")
10
+ if(NOT EXISTS "${_file}")
11
+ message(FATAL_ERROR "File or directory ${_file} referenced by variable ${_var} does not exist !")
12
+ endif()
13
+ endmacro()
14
+
15
+ macro(check_required_components _NAME)
16
+ foreach(comp ${${_NAME}_FIND_COMPONENTS})
17
+ if(NOT ${_NAME}_${comp}_FOUND)
18
+ if(${_NAME}_FIND_REQUIRED_${comp})
19
+ set(${_NAME}_FOUND FALSE)
20
+ endif()
21
+ endif()
22
+ endforeach()
23
+ endmacro()
24
+
25
+ ####################################################################################
26
+
27
+ include("${CMAKE_CURRENT_LIST_DIR}/casteTargets.cmake")
@@ -0,0 +1,65 @@
1
+ # This is a basic version file for the Config-mode of find_package().
2
+ # It is used by write_basic_package_version_file() as input file for configure_file()
3
+ # to create a version-file which can be installed along a config.cmake file.
4
+ #
5
+ # The created file sets PACKAGE_VERSION_EXACT if the current version string and
6
+ # the requested version string are exactly the same and it sets
7
+ # PACKAGE_VERSION_COMPATIBLE if the current version is >= requested version,
8
+ # but only if the requested major version is the same as the current one.
9
+ # The variable CVF_VERSION must be set before calling configure_file().
10
+
11
+
12
+ set(PACKAGE_VERSION "0.1.0")
13
+
14
+ if(PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION)
15
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
16
+ else()
17
+
18
+ if("0.1.0" MATCHES "^([0-9]+)\\.")
19
+ set(CVF_VERSION_MAJOR "${CMAKE_MATCH_1}")
20
+ if(NOT CVF_VERSION_MAJOR VERSION_EQUAL 0)
21
+ string(REGEX REPLACE "^0+" "" CVF_VERSION_MAJOR "${CVF_VERSION_MAJOR}")
22
+ endif()
23
+ else()
24
+ set(CVF_VERSION_MAJOR "0.1.0")
25
+ endif()
26
+
27
+ if(PACKAGE_FIND_VERSION_RANGE)
28
+ # both endpoints of the range must have the expected major version
29
+ math (EXPR CVF_VERSION_MAJOR_NEXT "${CVF_VERSION_MAJOR} + 1")
30
+ if (NOT PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
31
+ OR ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX_MAJOR STREQUAL CVF_VERSION_MAJOR)
32
+ OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND NOT PACKAGE_FIND_VERSION_MAX VERSION_LESS_EQUAL CVF_VERSION_MAJOR_NEXT)))
33
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
34
+ elseif(PACKAGE_FIND_VERSION_MIN_MAJOR STREQUAL CVF_VERSION_MAJOR
35
+ AND ((PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "INCLUDE" AND PACKAGE_VERSION VERSION_LESS_EQUAL PACKAGE_FIND_VERSION_MAX)
36
+ OR (PACKAGE_FIND_VERSION_RANGE_MAX STREQUAL "EXCLUDE" AND PACKAGE_VERSION VERSION_LESS PACKAGE_FIND_VERSION_MAX)))
37
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
38
+ else()
39
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
40
+ endif()
41
+ else()
42
+ if(PACKAGE_FIND_VERSION_MAJOR STREQUAL CVF_VERSION_MAJOR)
43
+ set(PACKAGE_VERSION_COMPATIBLE TRUE)
44
+ else()
45
+ set(PACKAGE_VERSION_COMPATIBLE FALSE)
46
+ endif()
47
+
48
+ if(PACKAGE_FIND_VERSION STREQUAL PACKAGE_VERSION)
49
+ set(PACKAGE_VERSION_EXACT TRUE)
50
+ endif()
51
+ endif()
52
+ endif()
53
+
54
+
55
+ # if the installed or the using project don't have CMAKE_SIZEOF_VOID_P set, ignore it:
56
+ if("${CMAKE_SIZEOF_VOID_P}" STREQUAL "" OR "8" STREQUAL "")
57
+ return()
58
+ endif()
59
+
60
+ # check that the installed version has the same 32/64bit-ness as the one which is currently searching:
61
+ if(NOT CMAKE_SIZEOF_VOID_P STREQUAL "8")
62
+ math(EXPR installedBits "8 * 8")
63
+ set(PACKAGE_VERSION "${PACKAGE_VERSION} (${installedBits}bit)")
64
+ set(PACKAGE_VERSION_UNSUITABLE TRUE)
65
+ endif()
@@ -0,0 +1,19 @@
1
+ #----------------------------------------------------------------
2
+ # Generated CMake target import file for configuration "Release".
3
+ #----------------------------------------------------------------
4
+
5
+ # Commands may need to know the format version.
6
+ set(CMAKE_IMPORT_FILE_VERSION 1)
7
+
8
+ # Import target "caste::caste" for configuration "Release"
9
+ set_property(TARGET caste::caste APPEND PROPERTY IMPORTED_CONFIGURATIONS RELEASE)
10
+ set_target_properties(caste::caste PROPERTIES
11
+ IMPORTED_LINK_INTERFACE_LANGUAGES_RELEASE "CXX"
12
+ IMPORTED_LOCATION_RELEASE "${_IMPORT_PREFIX}/lib/libcaste.a"
13
+ )
14
+
15
+ list(APPEND _cmake_import_check_targets caste::caste )
16
+ list(APPEND _cmake_import_check_files_for_caste::caste "${_IMPORT_PREFIX}/lib/libcaste.a" )
17
+
18
+ # Commands beyond this point should not need to know the version.
19
+ set(CMAKE_IMPORT_FILE_VERSION)
@@ -0,0 +1,108 @@
1
+ # Generated by CMake
2
+
3
+ if("${CMAKE_MAJOR_VERSION}.${CMAKE_MINOR_VERSION}" LESS 2.8)
4
+ message(FATAL_ERROR "CMake >= 2.8.3 required")
5
+ endif()
6
+ if(CMAKE_VERSION VERSION_LESS "2.8.3")
7
+ message(FATAL_ERROR "CMake >= 2.8.3 required")
8
+ endif()
9
+ cmake_policy(PUSH)
10
+ cmake_policy(VERSION 2.8.3...4.0)
11
+ #----------------------------------------------------------------
12
+ # Generated CMake target import file.
13
+ #----------------------------------------------------------------
14
+
15
+ # Commands may need to know the format version.
16
+ set(CMAKE_IMPORT_FILE_VERSION 1)
17
+
18
+ # Protect against multiple inclusion, which would fail when already imported targets are added once more.
19
+ set(_cmake_targets_defined "")
20
+ set(_cmake_targets_not_defined "")
21
+ set(_cmake_expected_targets "")
22
+ foreach(_cmake_expected_target IN ITEMS caste::caste)
23
+ list(APPEND _cmake_expected_targets "${_cmake_expected_target}")
24
+ if(TARGET "${_cmake_expected_target}")
25
+ list(APPEND _cmake_targets_defined "${_cmake_expected_target}")
26
+ else()
27
+ list(APPEND _cmake_targets_not_defined "${_cmake_expected_target}")
28
+ endif()
29
+ endforeach()
30
+ unset(_cmake_expected_target)
31
+ if(_cmake_targets_defined STREQUAL _cmake_expected_targets)
32
+ unset(_cmake_targets_defined)
33
+ unset(_cmake_targets_not_defined)
34
+ unset(_cmake_expected_targets)
35
+ unset(CMAKE_IMPORT_FILE_VERSION)
36
+ cmake_policy(POP)
37
+ return()
38
+ endif()
39
+ if(NOT _cmake_targets_defined STREQUAL "")
40
+ string(REPLACE ";" ", " _cmake_targets_defined_text "${_cmake_targets_defined}")
41
+ string(REPLACE ";" ", " _cmake_targets_not_defined_text "${_cmake_targets_not_defined}")
42
+ message(FATAL_ERROR "Some (but not all) targets in this export set were already defined.\nTargets Defined: ${_cmake_targets_defined_text}\nTargets not yet defined: ${_cmake_targets_not_defined_text}\n")
43
+ endif()
44
+ unset(_cmake_targets_defined)
45
+ unset(_cmake_targets_not_defined)
46
+ unset(_cmake_expected_targets)
47
+
48
+
49
+ # Compute the installation prefix relative to this file.
50
+ get_filename_component(_IMPORT_PREFIX "${CMAKE_CURRENT_LIST_FILE}" PATH)
51
+ get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
52
+ get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
53
+ get_filename_component(_IMPORT_PREFIX "${_IMPORT_PREFIX}" PATH)
54
+ if(_IMPORT_PREFIX STREQUAL "/")
55
+ set(_IMPORT_PREFIX "")
56
+ endif()
57
+
58
+ # Create imported target caste::caste
59
+ add_library(caste::caste STATIC IMPORTED)
60
+
61
+ set_target_properties(caste::caste PROPERTIES
62
+ INTERFACE_COMPILE_DEFINITIONS "CASTE_VERSION=\"0.1.0\""
63
+ INTERFACE_COMPILE_FEATURES "cxx_std_20"
64
+ INTERFACE_INCLUDE_DIRECTORIES "/caste"
65
+ )
66
+
67
+ # Load information for each installed configuration.
68
+ file(GLOB _cmake_config_files "${CMAKE_CURRENT_LIST_DIR}/casteTargets-*.cmake")
69
+ foreach(_cmake_config_file IN LISTS _cmake_config_files)
70
+ include("${_cmake_config_file}")
71
+ endforeach()
72
+ unset(_cmake_config_file)
73
+ unset(_cmake_config_files)
74
+
75
+ # Cleanup temporary variables.
76
+ set(_IMPORT_PREFIX)
77
+
78
+ # Loop over all imported files and verify that they actually exist
79
+ foreach(_cmake_target IN LISTS _cmake_import_check_targets)
80
+ if(CMAKE_VERSION VERSION_LESS "3.28"
81
+ OR NOT DEFINED _cmake_import_check_xcframework_for_${_cmake_target}
82
+ OR NOT IS_DIRECTORY "${_cmake_import_check_xcframework_for_${_cmake_target}}")
83
+ foreach(_cmake_file IN LISTS "_cmake_import_check_files_for_${_cmake_target}")
84
+ if(NOT EXISTS "${_cmake_file}")
85
+ message(FATAL_ERROR "The imported target \"${_cmake_target}\" references the file
86
+ \"${_cmake_file}\"
87
+ but this file does not exist. Possible reasons include:
88
+ * The file was deleted, renamed, or moved to another location.
89
+ * An install or uninstall procedure did not complete successfully.
90
+ * The installation package was faulty and contained
91
+ \"${CMAKE_CURRENT_LIST_FILE}\"
92
+ but not all the files it references.
93
+ ")
94
+ endif()
95
+ endforeach()
96
+ endif()
97
+ unset(_cmake_file)
98
+ unset("_cmake_import_check_files_for_${_cmake_target}")
99
+ endforeach()
100
+ unset(_cmake_target)
101
+ unset(_cmake_import_check_targets)
102
+
103
+ # This file does not depend on other imported targets which have
104
+ # been exported from the same project but in a separate export set.
105
+
106
+ # Commands beyond this point should not need to know the version.
107
+ set(CMAKE_IMPORT_FILE_VERSION)
108
+ cmake_policy(POP)
lib/libcaste.a ADDED
Binary file
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Zeth
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
share/man/man1/caste.1 ADDED
@@ -0,0 +1,36 @@
1
+ .TH CASTE 1 "February 1, 2026" "caste 0.1.0" "User Commands"
2
+ .SH NAME
3
+ caste \- print a single-word hardware class
4
+ .SH SYNOPSIS
5
+ .B caste
6
+ [\fB\-\-reason\fR]
7
+ [\fB\-\-version\fR]
8
+ [\fB\-h\fR|\fB\-\-help\fR]
9
+ .SH DESCRIPTION
10
+ The
11
+ .B caste
12
+ command prints a single-word hardware class inferred from the system:
13
+ Mini, User, Developer, Workstation, or Rig.
14
+ .SH OPTIONS
15
+ .TP
16
+ .B \-\-reason
17
+ Include a short explanation after the class.
18
+ .TP
19
+ .B \-\-version
20
+ Print the version and exit.
21
+ .TP
22
+ .B \-h, \-\-help
23
+ Show a brief usage message.
24
+ .SH EXAMPLES
25
+ .TP
26
+ .B caste
27
+ Print the class only.
28
+ .TP
29
+ .B caste \-\-reason
30
+ Print the class and a short explanation.
31
+ .SH EXIT STATUS
32
+ .TP
33
+ .B 0
34
+ Success.
35
+ .SH SEE ALSO
36
+ .BR uname (1)