valise-sh 0.2.0 → 0.3.0
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.
- package/CHANGELOG.md +152 -2
- package/README.md +99 -146
- package/bin/valise +57 -5376
- package/docs/architecture.md +77 -121
- package/docs/contrib-modules.md +172 -218
- package/docs/installation.md +137 -83
- package/docs/module-abi.md +125 -126
- package/docs/projects.md +249 -0
- package/docs/release-policy.md +68 -93
- package/docs/shared-modules.md +40 -39
- package/examples/README.md +12 -11
- package/examples/e2e/README.md +59 -66
- package/examples/e2e/bundles.tsv +6 -0
- package/examples/e2e/module.d/e2e_aliases.meta +1 -2
- package/examples/e2e/module.d/e2e_completions_bash.meta +0 -1
- package/examples/e2e/module.d/e2e_completions_zsh.meta +0 -1
- package/examples/e2e/module.d/e2e_env_setup.meta +2 -3
- package/examples/e2e/module.d/e2e_fish_features.meta +0 -1
- package/examples/e2e/module.d/e2e_generated_config.meta +1 -2
- package/examples/e2e/module.d/e2e_ksh_features.meta +0 -1
- package/examples/e2e/module.d/e2e_layer_probe.meta +1 -2
- package/examples/e2e/module.d/e2e_optional_network.meta +1 -2
- package/examples/e2e/module.d/e2e_platform_tools.meta +8 -0
- package/examples/e2e/module.d/e2e_platform_tools_bsd.meta +2 -3
- package/examples/e2e/module.d/e2e_platform_tools_darwin.meta +2 -3
- package/examples/e2e/module.d/e2e_platform_tools_linux.meta +2 -3
- package/examples/e2e/valise.conf +4 -0
- package/examples/e2e/variants.tsv +3 -0
- package/examples/local/module.d/hello_valise.meta +1 -2
- package/examples/profile-project/README.md +78 -108
- package/examples/profile-project/bundles.tsv +8 -0
- package/examples/profile-project/{shell/layers → layers}/demo/module.d/contrib_demo_greeting.meta +1 -2
- package/examples/profile-project/{shell/module.d → module.d}/greeting.meta +1 -2
- package/examples/profile-project/{shell/module.d → module.d}/profile_main.meta +0 -1
- package/examples/profile-project/{shell/modules → modules}/greeting.sh +1 -1
- package/examples/profile-project/valise.conf +4 -0
- package/examples/profile-project/variants.tsv +3 -0
- package/examples/shared/README.md +13 -34
- package/examples/shared/module.d/contrib_shared_paths.meta +2 -3
- package/examples/shared/module.d/contrib_shared_umask.meta +1 -2
- package/examples/shared/modules/shared/contrib_shared_paths.sh +2 -2
- package/lib/capabilities.sh +40 -13
- package/lib/cli/commands.sh +278 -0
- package/lib/cli/common.sh +326 -0
- package/lib/cli/devtools.sh +539 -0
- package/lib/cli/fish-hook.sh +986 -0
- package/lib/cli/integration.sh +337 -0
- package/lib/cli/lifecycle.sh +578 -0
- package/lib/cli/project.sh +1807 -0
- package/lib/cli/store.sh +1023 -0
- package/lib/cli/usage.sh +308 -0
- package/lib/compiler.awk +11 -4
- package/lib/fish/loader.fish +69 -9
- package/lib/fish/metadata.fish +49 -5
- package/lib/fish/profile.fish +170 -0
- package/lib/loader.sh +6 -8
- package/lib/metadata.sh +111 -5
- package/manifests/parser-support.tsv +2 -2
- package/module.d/valise_editor.meta +9 -0
- package/module.d/valise_history.meta +9 -0
- package/module.d/valise_pager.meta +9 -0
- package/module.d/valise_path.meta +9 -0
- package/module.d/{platform_bsd.meta → valise_platform_bsd.meta} +3 -4
- package/module.d/{platform_linux.meta → valise_platform_linux.meta} +3 -4
- package/module.d/{platform_macos.meta → valise_platform_macos.meta} +3 -4
- package/module.d/{platform_posix.meta → valise_platform_posix.meta} +2 -3
- package/module.d/valise_xdg.meta +9 -0
- package/modules/system/{contrib_editor.sh → valise_editor.sh} +2 -2
- package/modules/system/{contrib_history.sh → valise_history.sh} +2 -2
- package/modules/system/{contrib_pager.sh → valise_pager.sh} +2 -2
- package/modules/system/{contrib_path.sh → valise_path.sh} +3 -3
- package/modules/system/{contrib_xdg.sh → valise_xdg.sh} +2 -2
- package/package.json +91 -10
- package/docs/variants.md +0 -327
- package/entrypoints/.gitkeep +0 -0
- package/entrypoints/fish/profile.fish +0 -99
- package/examples/e2e/build-manifest.sh +0 -138
- package/examples/local/.gitkeep +0 -0
- package/examples/profile-project/shell/release/bundle-roots +0 -9
- package/examples/profile-project/shell/release/install-variants +0 -3
- package/examples/profile-project/shell/release/module-registry.tsv +0 -4
- package/examples/profile-project/shell/release/project.conf +0 -3
- package/lib/.gitkeep +0 -0
- package/manifests/.gitkeep +0 -0
- package/module.d/.gitkeep +0 -0
- package/module.d/contrib_editor.meta +0 -10
- package/module.d/contrib_history.meta +0 -10
- package/module.d/contrib_pager.meta +0 -10
- package/module.d/contrib_path.meta +0 -10
- package/module.d/contrib_xdg.meta +0 -10
- package/modules/.gitkeep +0 -0
- /package/examples/profile-project/{shell/layers → layers}/demo/modules/shared/contrib_demo_greeting.sh +0 -0
package/CHANGELOG.md
CHANGED
|
@@ -3,7 +3,157 @@
|
|
|
3
3
|
Notable user-facing changes are recorded here. Versions before 1.0 may include
|
|
4
4
|
module ABI or CLI changes; see [the release policy](docs/release-policy.md).
|
|
5
5
|
|
|
6
|
-
## [
|
|
6
|
+
## [0.3.0] - 2026-11-06
|
|
7
|
+
|
|
8
|
+
0.3.0 changes the project layout, the metadata, and the release format. A
|
|
9
|
+
0.2 project must be moved to the new layout and its releases rebuilt; see
|
|
10
|
+
[What changed in 0.3.0](docs/release-policy.md#what-changed-in-030).
|
|
11
|
+
|
|
12
|
+
### Added
|
|
13
|
+
|
|
14
|
+
- Published commands. Metadata `commands=` names exports to publish and
|
|
15
|
+
`executables=` names scripts. `valise build` writes a command plan per
|
|
16
|
+
module under `plans/commands/` and a launcher per name under `bin/`, and
|
|
17
|
+
install writes a stub for each into
|
|
18
|
+
`${VALISE_BIN_DIR:-${XDG_BIN_HOME:-$HOME/.local/bin}}`. valise records
|
|
19
|
+
the stubs it writes in `$XDG_STATE_HOME/valise/commands.tsv` and never
|
|
20
|
+
replaces or removes a file it did not write. `valise doctor` reports
|
|
21
|
+
collisions and a command directory missing from `PATH`.
|
|
22
|
+
- `valise lint [--require-parsers] [module...]` checks metadata, layers,
|
|
23
|
+
every bundle compiled for every variant and shell, and the syntax of each
|
|
24
|
+
body and test with the parser of every shell the module declares. The
|
|
25
|
+
`valise.conf` key `lint_layer_forbid` makes lint reject a pattern, such as
|
|
26
|
+
an employer name, anywhere under `layers/`.
|
|
27
|
+
- `valise test [--shell=<class>] [--require-shells] [module...]` runs each
|
|
28
|
+
module's `tests=` scripts in every declared shell that is installed, in
|
|
29
|
+
an `env -i` environment with a fresh `HOME` and XDG tree.
|
|
30
|
+
`valise_test_reload` lets a test write fixtures and load the module again.
|
|
31
|
+
- `valise run [--shell=<class>] [--module=<m>]... [--bundle=<b>]
|
|
32
|
+
[--variant=<v>] [--keep-env] -- <script>` loads modules into a shell and
|
|
33
|
+
runs a script there.
|
|
34
|
+
- `valise env` prints the engine, project, and storage paths as shell-quoted
|
|
35
|
+
`KEY=value` lines.
|
|
36
|
+
- `valise test` and `valise run` export `VALISE_TEST_RELEASE` and
|
|
37
|
+
`VALISE_TEST_PLAN`, so a test can load the same modules in a child shell.
|
|
38
|
+
- `valise uninstall [--keep-releases]` removes the managed blocks (keeping
|
|
39
|
+
every other byte and the file mode), the startup files install created
|
|
40
|
+
that are left empty, the Fish hook, the owned command stubs, the active
|
|
41
|
+
link, and the installed releases.
|
|
42
|
+
- `valise release rollback` makes the previously active release active
|
|
43
|
+
again. Every switch records the release it replaced in
|
|
44
|
+
`$XDG_STATE_HOME/valise/previous`.
|
|
45
|
+
- `valise apply --dry-run` builds the project and prints what install would
|
|
46
|
+
change in the release store, the startup files, the Fish hook, and the
|
|
47
|
+
command directory, without writing outside `build/`.
|
|
48
|
+
- A bundle's `fish` rows build the native Fish runtime into the release
|
|
49
|
+
under `runtime/fish/`, and the Fish hook loads the bundle's Fish roots
|
|
50
|
+
from it. `valise new` scaffolds a Fish seed module.
|
|
51
|
+
- `valise -C <dir>` runs a command as if started in `dir`. Project commands
|
|
52
|
+
find the project from any subdirectory.
|
|
53
|
+
- `valise.conf` key `requires_valise`: an older valise refuses to build the
|
|
54
|
+
project.
|
|
55
|
+
- `valise module new --into=<module>[,...]` and `--no-wire` for projects
|
|
56
|
+
whose default bundle has several POSIX roots.
|
|
57
|
+
- Metadata `tests=` names the test scripts of a module.
|
|
58
|
+
- `shells=posix` names every POSIX shell.
|
|
59
|
+
- `docs/projects.md` describes the project layout, bundles, variants,
|
|
60
|
+
compile, and build.
|
|
61
|
+
|
|
62
|
+
### Changed
|
|
63
|
+
|
|
64
|
+
- A project is the directory holding `valise.conf`, with `module.d/`,
|
|
65
|
+
`modules/`, `layers/<provider>/`, `bundles.tsv`, and `variants.tsv` at its
|
|
66
|
+
root. `valise.conf` replaces `shell/release/project.conf`, `bundles.tsv`
|
|
67
|
+
replaces `shell/release/bundle-roots`, and `variants.tsv` replaces
|
|
68
|
+
`shell/release/install-variants`. The `shell/` layout is not read.
|
|
69
|
+
- The registry is internal: `valise build` generates it on demand from the
|
|
70
|
+
metadata, and `valise registry` prints it. It has columns for `commands`,
|
|
71
|
+
`executables`, and `tests` and a `source` of `module.d`,
|
|
72
|
+
`layers/<provider>/module.d`, or `valise`.
|
|
73
|
+
- The engine modules are renamed into the reserved `valise_` namespace
|
|
74
|
+
(`valise_path`, `valise_editor`, `valise_history`, `valise_pager`,
|
|
75
|
+
`valise_xdg`, `valise_platform_posix`, `valise_platform_macos`,
|
|
76
|
+
`valise_platform_linux`, `valise_platform_bsd`), with exports renamed to
|
|
77
|
+
match, such as `valise_path_prepend`. They are available to every
|
|
78
|
+
project without vendoring. A project or layer module may not use the
|
|
79
|
+
`valise_` prefix, and layer modules must use `contrib_`.
|
|
80
|
+
- `shells=sh` names only the generic POSIX class (dash, BusyBox ash, and
|
|
81
|
+
other plain `sh`), so `shells=sh bash ksh` loads in dash, bash, and ksh
|
|
82
|
+
and not in zsh. Use `shells=posix` for every POSIX shell.
|
|
83
|
+
- Release format 2. A release holds `plans/<shell>.sh` for `sh`, `bash`,
|
|
84
|
+
`zsh`, and `ksh`, `runtime/capabilities.sh`, `valise-release.conf`
|
|
85
|
+
(`format=2`, the bundle, the variant, the roots per shell, the modules,
|
|
86
|
+
and the commands), and `manifest.tsv`. It contains only the modules some
|
|
87
|
+
plan loads, so a module a variant excludes is absent with its body.
|
|
88
|
+
Install refuses a tree without `format=2`.
|
|
89
|
+
- The POSIX managed block picks the plan for `ksh`, `zsh`, `bash`, or `sh`
|
|
90
|
+
and sets its guard only after the plan loaded, so a later startup file
|
|
91
|
+
retries after a failure.
|
|
92
|
+
- Install is transactional. It checks every startup file, the Fish hook
|
|
93
|
+
path, and (when commands are published or already tracked) the command
|
|
94
|
+
directory before changing the active release and, if a later step fails,
|
|
95
|
+
restores the previous active release, the previous-release record, and
|
|
96
|
+
the command stubs, and names the files it already wrote. A new managed
|
|
97
|
+
block is appended with nothing around it, so uninstall restores the file
|
|
98
|
+
exactly. Text after a block keeps the file's ending, with or without a
|
|
99
|
+
final newline, and a repeat install rewrites nothing.
|
|
100
|
+
- Install warns, and `valise doctor` fails, on a line outside a managed block
|
|
101
|
+
that loads valise by hand.
|
|
102
|
+
- `valise build` moves the previous `build/release` aside and restores it if
|
|
103
|
+
publication fails.
|
|
104
|
+
- An identical installed Fish hook is left in place, and apply reports
|
|
105
|
+
`Fish hook current`.
|
|
106
|
+
- `valise status` reports the bundle, variant, and valise version the active
|
|
107
|
+
release was built with, separately from the project defaults.
|
|
108
|
+
- `valise explain-variant` counts the roots and modules a variant keeps per
|
|
109
|
+
shell, resolving qualified names.
|
|
110
|
+
- `bin/valise` is a dispatcher over the parts in `lib/cli/`.
|
|
111
|
+
- The package `files` list names every shipped file, so packing a local tree
|
|
112
|
+
ships only the runtime, the docs, and the example sources, not stray local
|
|
113
|
+
files. A test fails when a tracked file is missing from the list.
|
|
114
|
+
|
|
115
|
+
### Removed
|
|
116
|
+
|
|
117
|
+
- The `shell/` project layout, `registry --check`, and the committed
|
|
118
|
+
registry.
|
|
119
|
+
- Metadata `updates=`. Metadata naming it fails with a message naming
|
|
120
|
+
0.3.0.
|
|
121
|
+
- The engine release shape: `entrypoints/fish/profile.fish`, the POSIX
|
|
122
|
+
block's loader fallback, and the Fish hook's `generated/`, `vendor/`, and
|
|
123
|
+
entrypoint routes.
|
|
124
|
+
- `examples/e2e/build-manifest.sh`; `examples/e2e` is a valise project built
|
|
125
|
+
with `valise build`.
|
|
126
|
+
- `docs/variants.md`, replaced by `docs/projects.md`.
|
|
127
|
+
|
|
128
|
+
### Fixed
|
|
129
|
+
|
|
130
|
+
- `sp_cap_secure_local_bin_check` accepts `allow-owned-symlinks`. The default
|
|
131
|
+
still rejects every symlink in `~/.local/bin`; the option accepts a symlink
|
|
132
|
+
whose link entry is owned by the current user, which is how pipx and uv
|
|
133
|
+
publish commands, while still rejecting unowned entries and group- or
|
|
134
|
+
other-writable regular files.
|
|
135
|
+
- A repeated metadata field was silently overwritten by the last value; the
|
|
136
|
+
POSIX and Fish readers now reject it.
|
|
137
|
+
- The Fish loader rejected caller aliases, because `functions --copy` drops
|
|
138
|
+
`--wraps`.
|
|
139
|
+
- Fish 3 lists autoloadable but undefined functions in `functions --all
|
|
140
|
+
--names`, and that list grows as the loader introspects it. The Fish loader
|
|
141
|
+
and the generated hook now take their "created by this activation" baseline
|
|
142
|
+
after that introspection, so Fish's own system functions are no longer
|
|
143
|
+
attributed to a module or an entrypoint and published in an ownership
|
|
144
|
+
ledger whose `/usr/share/fish` source can never be authenticated.
|
|
145
|
+
- A body that replaced `cd` on Fish 3, where `cd` is a file-backed system
|
|
146
|
+
function rather than an embedded one, was reported as a generic loader-state
|
|
147
|
+
mutation. It now fails closed as a mutated critical Fish function, matching
|
|
148
|
+
Fish 4.
|
|
149
|
+
- A module body that sourced a Fish completion or function file, or ran
|
|
150
|
+
completions, materialized Fish's own system functions. Those entered the
|
|
151
|
+
ownership ledger, so the next activation failed closed before its cleanup
|
|
152
|
+
erased real Fish functions. Fish system functions are no longer recorded as
|
|
153
|
+
module- or entrypoint-owned, on Fish 3 (file paths) and Fish 4 (embedded
|
|
154
|
+
paths) alike.
|
|
155
|
+
- `valise doctor` did not accept FreeBSD's `sha256`.
|
|
156
|
+
- `valise module new` assumed the seed module was `profile_main`.
|
|
7
157
|
|
|
8
158
|
## [0.2.0] - 2026-10-31
|
|
9
159
|
|
|
@@ -172,6 +322,6 @@ module ABI or CLI changes; see [the release policy](docs/release-policy.md).
|
|
|
172
322
|
- The editor-defaults test is independent of host-installed editors by
|
|
173
323
|
supplying a temporary test `vi` executable.
|
|
174
324
|
|
|
175
|
-
[
|
|
325
|
+
[0.3.0]: https://github.com/joeycumines/valise-sh/compare/v0.2.0...v0.3.0
|
|
176
326
|
[0.2.0]: https://github.com/joeycumines/valise-sh/compare/v0.1.0...v0.2.0
|
|
177
327
|
[0.1.0]: https://github.com/joeycumines/valise-sh/releases/tag/v0.1.0
|
package/README.md
CHANGED
|
@@ -1,170 +1,123 @@
|
|
|
1
1
|
# valise-sh
|
|
2
2
|
|
|
3
|
-
valise
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
engine is designed to be vendored by that project, for example as a Git
|
|
14
|
-
submodule; the consumer owns its profile and release contents.
|
|
15
|
-
|
|
16
|
-
## Try a sample release
|
|
17
|
-
|
|
18
|
-
This walkthrough builds and installs the included sample profile in an
|
|
19
|
-
isolated temporary home. `valise install` deploys its normal shell
|
|
20
|
-
integration there, so your real home directory and startup files are left
|
|
21
|
-
untouched.
|
|
3
|
+
valise builds your shell profile from modules. Each module is a metadata file
|
|
4
|
+
and a shell body; valise reads the metadata as data, compiles a static
|
|
5
|
+
startup plan for each shell, and installs the result as a sealed, verified
|
|
6
|
+
release. sh, dash, BusyBox ash, bash, zsh, and ksh load the compiled POSIX
|
|
7
|
+
plans; Fish has a native loader.
|
|
8
|
+
|
|
9
|
+
You keep your modules in a valise project. The engine supplies the `valise`
|
|
10
|
+
CLI and a few generic modules (`valise_path`, `valise_editor`, and others).
|
|
11
|
+
|
|
12
|
+
## Quick start
|
|
22
13
|
|
|
23
14
|
```sh
|
|
24
15
|
git clone https://github.com/joeycumines/valise-sh.git
|
|
25
|
-
|
|
26
|
-
export PATH="$PWD/bin:$PATH"
|
|
16
|
+
export PATH="$PWD/valise-sh/bin:$PATH"
|
|
27
17
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
rm -rf "$_demo_state"
|
|
35
|
-
}
|
|
36
|
-
trap cleanup_demo EXIT
|
|
37
|
-
trap 'exit 130' INT
|
|
38
|
-
trap 'exit 143' TERM
|
|
39
|
-
mkdir -p "$_demo_state/home"
|
|
40
|
-
export HOME="$_demo_state/home"
|
|
41
|
-
export XDG_DATA_HOME="$_demo_state/data"
|
|
42
|
-
export XDG_CONFIG_HOME="$_demo_state/config"
|
|
43
|
-
export XDG_STATE_HOME="$_demo_state/state"
|
|
44
|
-
|
|
45
|
-
# Build, install, and apply the sample profile project.
|
|
46
|
-
(cd examples/profile-project && valise apply)
|
|
47
|
-
|
|
48
|
-
# Run the greeting function exposed by the active profile.
|
|
49
|
-
bash -l -c 'greet'
|
|
50
|
-
)
|
|
18
|
+
valise new my-profile
|
|
19
|
+
cd my-profile
|
|
20
|
+
valise module new hello --exports=hello
|
|
21
|
+
$EDITOR modules/hello.sh
|
|
22
|
+
valise lint
|
|
23
|
+
valise apply
|
|
51
24
|
```
|
|
52
25
|
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
## Build your own profile
|
|
26
|
+
`valise apply` builds the project, installs the release, writes a managed
|
|
27
|
+
block into your startup files, and verifies the active release. Open a new
|
|
28
|
+
login shell to load it. `valise apply --dry-run` shows what would change
|
|
29
|
+
first, and `valise uninstall` removes everything install wrote.
|
|
59
30
|
|
|
60
|
-
|
|
61
|
-
|
|
31
|
+
To try it without touching your real home directory, point `HOME` and the
|
|
32
|
+
XDG directories at a scratch directory:
|
|
62
33
|
|
|
63
34
|
```sh
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
35
|
+
(
|
|
36
|
+
set -eu
|
|
37
|
+
demo=$(mktemp -d)
|
|
38
|
+
trap 'chmod -R u+w "$demo"; rm -rf "$demo"' EXIT
|
|
39
|
+
export HOME="$demo/home" XDG_DATA_HOME="$demo/data" \
|
|
40
|
+
XDG_CONFIG_HOME="$demo/config" XDG_STATE_HOME="$demo/state" \
|
|
41
|
+
XDG_BIN_HOME="$demo/bin"
|
|
42
|
+
mkdir -p "$HOME"
|
|
43
|
+
cd valise-sh/examples/profile-project
|
|
44
|
+
valise apply
|
|
45
|
+
bash -l -c greet
|
|
46
|
+
)
|
|
67
47
|
```
|
|
68
48
|
|
|
69
|
-
|
|
70
|
-
roots, variants, and `project.conf`. Add modules with `valise module new`,
|
|
71
|
-
then build and install:
|
|
49
|
+
## A project
|
|
72
50
|
|
|
73
|
-
```
|
|
74
|
-
valise
|
|
75
|
-
|
|
51
|
+
```
|
|
52
|
+
valise.conf project settings
|
|
53
|
+
module.d/ <name>.meta: one metadata file per module
|
|
54
|
+
modules/ module bodies
|
|
55
|
+
layers/<p>/ modules vendored from another provider (optional)
|
|
56
|
+
bundles.tsv the root modules for each shell
|
|
57
|
+
variants.tsv named sets of modules to leave out (optional)
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
A module's metadata names its dependencies, the shells and platforms it
|
|
61
|
+
supports, the functions it exports, and optionally the exports to publish
|
|
62
|
+
as commands on `PATH`:
|
|
63
|
+
|
|
64
|
+
```text
|
|
65
|
+
name=hello
|
|
66
|
+
version=1.0.0
|
|
67
|
+
side_effect=read-only
|
|
68
|
+
requires=valise_path
|
|
69
|
+
optional=
|
|
70
|
+
shells=posix
|
|
71
|
+
platforms=any
|
|
72
|
+
exports=hello
|
|
73
|
+
commands=hello
|
|
74
|
+
tests=tests/hello.sh
|
|
75
|
+
load=modules/hello.sh
|
|
76
76
|
```
|
|
77
77
|
|
|
78
|
-
|
|
79
|
-
a provider layer, two variants, and a bundle. Its
|
|
80
|
-
[README](examples/profile-project/README.md) walks through each step and
|
|
81
|
-
explains what the generated release contains.
|
|
82
|
-
|
|
83
|
-
## Repository layout
|
|
84
|
-
|
|
85
|
-
- `entrypoints/profile.sh` — the portable entrypoint. It is sourced, not
|
|
86
|
-
executed: it resolves the engine root, sources the three libraries, and
|
|
87
|
-
calls the loader with the requested modules.
|
|
88
|
-
- `lib/metadata.sh` — parses `module.d/*.meta` files as data and validates
|
|
89
|
-
identifiers, lists, paths, shells, platforms, and side-effect classes.
|
|
90
|
-
- `lib/loader.sh` — resolves the dependency closure, selects modules by
|
|
91
|
-
shell/platform/phase, sources bodies, checks declared exports, and cleans
|
|
92
|
-
up on failure.
|
|
93
|
-
- `lib/capabilities.sh` — portable helpers (`sp_cap_*`) that modules call
|
|
94
|
-
instead of platform-specific commands.
|
|
95
|
-
- `lib/fish/` — native Fish loader and metadata reader. The Fish path never
|
|
96
|
-
sources POSIX shell bodies.
|
|
97
|
-
- `bin/valise` — the CLI: init, install, release, doctor, make-manifest,
|
|
98
|
-
registry, new, module, build, apply, status, compile, explain-variant,
|
|
99
|
-
explain-bundles, layer-lint, version.
|
|
100
|
-
`init`, `install`, `release`, `doctor`, `make-manifest`, `new`, and
|
|
101
|
-
`version` run from a bare checkout. `registry`, `module`, `build`, `apply`,
|
|
102
|
-
`status`, `compile`, `explain-variant`,
|
|
103
|
-
`explain-bundles`, and `layer-lint` require the consuming project's source
|
|
104
|
-
tree (see [docs/variants.md](docs/variants.md) and
|
|
105
|
-
[docs/contrib-modules.md](docs/contrib-modules.md)). No command requires
|
|
106
|
-
Python 3.
|
|
107
|
-
- `module.d/` and `modules/platform/` — generic platform modules
|
|
108
|
-
(`platform_posix`, `platform_macos`, `platform_linux`, `platform_bsd`).
|
|
109
|
-
- `manifests/parser-support.tsv` — declares the shell parsers used to check
|
|
110
|
-
each source-file class.
|
|
111
|
-
- `tests/` — the test suite. Every test runs in a quarantined environment:
|
|
112
|
-
fresh temporary HOME, controlled TMPDIR and PATH, cleared startup hooks.
|
|
113
|
-
- `examples/local/` — a minimal runnable module demonstrating the metadata
|
|
114
|
-
contract.
|
|
115
|
-
- `examples/profile-project/` — a complete consuming project: metadata,
|
|
116
|
-
bodies, a provider layer, bundles, variants, and project defaults. Its
|
|
117
|
-
[README](examples/profile-project/README.md) walks from clone to a loaded
|
|
118
|
-
profile.
|
|
119
|
-
|
|
120
|
-
Product-specific modules, adapters, release packaging, and installer
|
|
121
|
-
transactions belong in the consuming project, not here. See
|
|
122
|
-
[docs/architecture.md](docs/architecture.md) for the scope.
|
|
78
|
+
## Commands
|
|
123
79
|
|
|
124
|
-
|
|
80
|
+
| Command | Does |
|
|
81
|
+
|---|---|
|
|
82
|
+
| `new`, `module new\|list\|remove` | Scaffold a project and its modules. |
|
|
83
|
+
| `lint`, `test`, `run`, `env` | Check metadata and syntax, run module tests in a clean shell, run a script with modules loaded, print paths. |
|
|
84
|
+
| `build`, `apply`, `status` | Build a release, build and install it, compare the active release with the build. |
|
|
85
|
+
| `install`, `release list\|use\|rollback\|prune\|verify`, `uninstall` | Manage installed releases. |
|
|
86
|
+
| `init`, `doctor` | Print the startup snippet; diagnose the installation. |
|
|
87
|
+
| `compile`, `registry`, `explain-bundles`, `explain-variant`, `layer-lint`, `make-manifest` | Inspect and debug a build. |
|
|
125
88
|
|
|
126
|
-
|
|
127
|
-
integration, XDG layout, publishing, and the integrity and provenance limits.
|
|
128
|
-
- [docs/module-abi.md](docs/module-abi.md) — the metadata contract: fields,
|
|
129
|
-
allowed values, multi-root search path, runtime detection, side-effect
|
|
130
|
-
phases, and the capability layer.
|
|
131
|
-
- [docs/architecture.md](docs/architecture.md) — what this repository
|
|
132
|
-
provides and what stays in the consuming project.
|
|
133
|
-
- [docs/variants.md](docs/variants.md) — build variant selection and
|
|
134
|
-
exclusion lists.
|
|
135
|
-
- [docs/contrib-modules.md](docs/contrib-modules.md) — module authoring
|
|
136
|
-
reference.
|
|
137
|
-
- [docs/shared-modules.md](docs/shared-modules.md) — governance and index
|
|
138
|
-
for shared modules: namespace ownership, review, deprecation, removal.
|
|
139
|
-
- [docs/release-policy.md](docs/release-policy.md) — compatibility surfaces,
|
|
140
|
-
current pre-1.0 status, and the release checklist.
|
|
141
|
-
- [CHANGELOG.md](CHANGELOG.md) — user-facing changes.
|
|
142
|
-
|
|
143
|
-
## Running the tests
|
|
144
|
-
|
|
145
|
-
The Makefile and the test suite live in the source repository. The npm
|
|
146
|
-
package ships the runtime, the docs, and the examples, not the Makefile.
|
|
89
|
+
`valise <command> --help` prints each command's contract.
|
|
147
90
|
|
|
148
|
-
|
|
149
|
-
make check-fast # quick contributor lane; no optional shells required
|
|
150
|
-
make check # available shell/runtime checks, CLI and end-to-end tests
|
|
151
|
-
```
|
|
91
|
+
## Documentation
|
|
152
92
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
(
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
93
|
+
- [docs/projects.md](docs/projects.md): the project layout, bundles,
|
|
94
|
+
variants, compile, and build.
|
|
95
|
+
- [docs/contrib-modules.md](docs/contrib-modules.md): writing, linting, and
|
|
96
|
+
testing modules.
|
|
97
|
+
- [docs/module-abi.md](docs/module-abi.md): every metadata field and what
|
|
98
|
+
the plans do with it.
|
|
99
|
+
- [docs/installation.md](docs/installation.md): installing the CLI, startup
|
|
100
|
+
files, published commands, the release store, and uninstalling.
|
|
101
|
+
- [docs/architecture.md](docs/architecture.md): how the pieces fit and what
|
|
102
|
+
stays in your project.
|
|
103
|
+
- [docs/shared-modules.md](docs/shared-modules.md): layers other people
|
|
104
|
+
consume.
|
|
105
|
+
- [docs/release-policy.md](docs/release-policy.md): compatibility and the
|
|
106
|
+
release checklist.
|
|
107
|
+
- [examples/](examples/README.md): a sample project, a multi-shell test
|
|
108
|
+
project, and a sample provider layer.
|
|
109
|
+
- [CHANGELOG.md](CHANGELOG.md)
|
|
110
|
+
|
|
111
|
+
## Development
|
|
160
112
|
|
|
161
113
|
```sh
|
|
162
|
-
make
|
|
114
|
+
make check-fast # quick lane; no optional shells required
|
|
115
|
+
make check # every available shell and runtime lane
|
|
163
116
|
```
|
|
164
117
|
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
118
|
+
`make check` uses the parsers in `manifests/parser-support.tsv`, the shells
|
|
119
|
+
`sh`, `bash`, `zsh`, `ksh`, `dash`, and `fish`, and BusyBox. A missing tool
|
|
120
|
+
is a visible skip locally and a failure when `CI=true` or
|
|
121
|
+
`GITHUB_ACTIONS=true`; `make VALISE_REQUIRE_TOOLING=1 check` requires them
|
|
122
|
+
locally. Machine-local settings go in an untracked `config.mk` (see
|
|
123
|
+
`config.mk.example`). Lima VM lanes run only when the instances exist.
|