Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
98f9b85
feat(component): select lockless workflows per component
ddstreet Oct 30, 2026
d84200e
refactor(cli): remove global without-lockfile flag
ddstreet Oct 30, 2026
b31ec10
feat(component): implement lockless upstream render lifecycle
ddstreet Nov 3, 2026
ea1177c
feat(component): carry over rendered autorelease state
ddstreet Nov 3, 2026
7c225c8
fix(component): ignore RPM diagnostics when querying render release
ddstreet Nov 3, 2026
442de33
fix(component): keep lockless rendering on the host
ddstreet Nov 3, 2026
9dcfc80
fix(component): skip synthetic history during lockless rendering
ddstreet Nov 4, 2026
7d0852c
fix(component): recover last render upstream pin from historical locks
ddstreet Nov 4, 2026
ea367f3
fix(component): allow historical lock fallback without selection file
ddstreet Nov 4, 2026
af6c5fa
fix(component): carry over baserelease definitions
ddstreet Nov 4, 2026
58b09e3
perf(component): clone only the selected upstream branch
ddstreet Nov 4, 2026
5d938b6
perf(build): run validation targets in parallel
ddstreet Nov 4, 2026
f7d7c8b
fix(component): preserve all lockless render files
ddstreet Nov 4, 2026
0739bae
fix(component): capture pristine upstream provenance
ddstreet Nov 4, 2026
969bdd1
fix(component): replace existing rendered aliases
ddstreet Nov 4, 2026
b51d025
perf(component): move prepared rendered output into place
ddstreet Nov 4, 2026
00d7d73
fix(component): apply overlays before release carryover
ddstreet Nov 4, 2026
b86b97e
fix(component): ignore Git metadata during render comparison
ddstreet Nov 4, 2026
c380ced
fix(component): compare lockless output before release bump
ddstreet Nov 4, 2026
401b33e
feat(component): require explicit no-change rebuilds
ddstreet Nov 4, 2026
db09526
perf(component): use native Git for render history
ddstreet Nov 4, 2026
a68f1c9
fix(component): preserve committed autorelease state
ddstreet Nov 5, 2026
af484dd
fix(component): preserve omitted autorelease bases
ddstreet Nov 5, 2026
0008aff
fix(component): gate release carryover on version changes
ddstreet Nov 5, 2026
63ba741
fix(component): refine lockless release carryover gates
ddstreet Nov 5, 2026
93ad59d
feat(component): customize lockless render comments and commits
ddstreet Nov 5, 2026
edd1331
feat(component): add make-lockless migration command
ddstreet Nov 5, 2026
421f75d
fix(spec): preserve Release field alignment when updating values
ddstreet Nov 5, 2026
2c91341
fix(component): omit redundant upstream pin TOML tables
ddstreet Nov 5, 2026
cb845a5
fix(component): prepare changelog and release before overlays
ddstreet Nov 5, 2026
8b33f04
feat(component): guard dirty lockless upstream renders
ddstreet Nov 5, 2026
9a4c904
feat(component): include pending inputs in first render commit
ddstreet Nov 5, 2026
cc582cf
feat(component): prompt for lockless render messages
ddstreet Nov 5, 2026
0a682b3
fix(component): clean editor-provided changelog messages
ddstreet Nov 6, 2026
94dfa2f
fix(component): recover missing upstream render history
ddstreet Nov 6, 2026
5ea60c8
fix(component): sort lockless component selections
ddstreet Nov 6, 2026
ffc05e9
feat(component): extract standalone dist-git repositories
ddstreet Nov 6, 2026
5859449
fix(component): align local lockless rendering behavior
ddstreet Nov 6, 2026
3aaeb71
fix(component): collect lockless render messages before publication
ddstreet Nov 6, 2026
39bcf22
fix(component): restrict rebuild timestamps to autorelease
ddstreet Nov 6, 2026
a51a589
fix(component): reject render prompts without interactive terminals
ddstreet Nov 6, 2026
91807db
fix(component): reject non-increasing lockless render NEVRs
ddstreet Nov 6, 2026
63674c0
fix(component): isolate lockless bumpspec RPM context
ddstreet Nov 6, 2026
2d3cedf
fix(component): allow equal NEVRs for autorelease renders
ddstreet Nov 6, 2026
9c4e37e
fix(component): use committed dist-git for lockless builds and queries
ddstreet Nov 7, 2026
fb6f8a7
feat(component): support lockless source preparation
ddstreet Nov 7, 2026
3d06305
fix(component): use working inputs when preparing lockless sources
ddstreet Nov 7, 2026
e8c951f
fix(component): scope lockless render cleanliness checks
ddstreet Nov 7, 2026
927ccc7
fix(component): preserve locked pins during orphan cleanup
ddstreet Nov 8, 2026
92b1388
fix(git): make single-branch cloning opt-in
ddstreet Nov 8, 2026
05e040d
fix(component): resolve autorelease before static transitions
ddstreet Nov 8, 2026
893ef16
perf(component): share project objects for lockless queries
ddstreet Nov 8, 2026
e340005
fix(component): skip lockless source preparation during dry runs
ddstreet Nov 8, 2026
44dde8a
fix(component): preserve locked render alias collisions
ddstreet Nov 8, 2026
7ad397f
fix(component): copy locked rendered output across filesystems
ddstreet Nov 8, 2026
4221b3e
fix(component): restore complete locked render drift checks
ddstreet Nov 8, 2026
bfc4bda
fix(spec): preserve release formatting only for lockless edits
ddstreet Nov 8, 2026
f7e1efc
fix(component): preserve Release formatting in lockless diff-sources
ddstreet Nov 8, 2026
9722e3a
feat(spec): add per-tag Release update and lookup helpers
ddstreet Nov 8, 2026
ef924d0
fix(component): render each lockless Release tag separately
ddstreet Nov 8, 2026
f52631f
fix(component): parse historical config permissively
ddstreet Nov 8, 2026
5244135
fix(component): resolve autorelease NEVR from dist-git history
ddstreet Nov 8, 2026
efc4949
fix(component): ignore %changelog Release lines in lockless bumps
ddstreet Nov 8, 2026
c2297fc
fix(component): fetch configured sources for lockless builds
ddstreet Nov 11, 2026
a966803
fix(component): detect render-only lockless changes
ddstreet Nov 11, 2026
d0364ae
fix(mock): retain stderr from failed rpmautospec probes
ddstreet Nov 11, 2026
3b575af
fix(sources): fetch other branches for pinned upstream commits
ddstreet Nov 11, 2026
516de3b
fix(component): rely on committed macros for lockless builds
ddstreet Nov 11, 2026
3139497
feat(component): inline macros in lockless rendered specs
ddstreet Nov 11, 2026
922e31f
test(scenario): refresh lockless CLI snapshots
ddstreet Nov 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 8 additions & 9 deletions .github/instructions/agent-skills.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,10 +68,9 @@ Before shipping any skill/instruction:

## Mode-specific content

azldev has two modes, and the emitted content follows the one it runs in. A `Catalog`
(`NewCatalog(withoutLockfile)`) resolves the skills, instruction wrappers, and templates;
the package-level `Skills`, `Instructions`, `FindSkill`, `SkillDocument`, and `Files`
helpers are the default (lock-file) mode.
The CLI always emits the default catalog, covering both workflows selected by
`lockless-components.txt`. `NewCatalog(true)` retains an internal all-lockless
variant; the package-level helpers use the default mixed-workflow catalog.

- **Shared by default.** Registry entries and templates under `content/` describe the
default mode and are used by both, so most edits need nothing extra.
Expand All @@ -82,11 +81,11 @@ helpers are the default (lock-file) mode.
same-named default template for that mode; add one only when the document's content
actually differs.

When you add or edit a skill, check whether its content names a command that exists in
only one mode (for example `comp update` versus `comp refresh-upstream-commit`) and, if
so, provide the mode-specific variant. Verify both with
`./out/bin/azldev docs agent show --skill <name>` and
`./out/bin/azldev --without-lockfile docs agent show --skill <name>`.
When editing a skill, describe which components each command processes:
`comp update` handles locked components; `comp refresh-upstream-commit` handles
listed lockless components. Verify CLI output with
`./out/bin/azldev docs agent show --skill <name>` and cover catalog variants in
unit tests. There is no global CLI mode selector.

## Config-resolved bindings

Expand Down
9 changes: 8 additions & 1 deletion docs/developer/reference/build.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ This repo contains configs for the `golangci-lint` linter. It is installed as pa
| Command | Description | When to Use |
|---------|-------------|-------------|
| `mage -l` | List all available targets | To see all options |
| `mage all` | Build, test, default checks, and scenario pipeline | Before submitting PR |
| `mage all` | Build, then run unit tests, default checks, and scenario tests in parallel; generate docs after they pass | Before submitting PR |
| `mage build` | Build Go binaries | After code changes |
| `mage install` | Build Go binaries and install | Outer-loop testing |
| `mage unit` | Run unit tests | After writing tests |
Expand All @@ -33,6 +33,13 @@ This repo contains configs for the `golangci-lint` linter. It is installed as pa
**Note**: Dependencies run automatically in correct order
(i.e. `mage build` and `mage unit` automatically run code generation as needed).

`mage all` shares one code-generation and build pass across its parallel
validation targets. Each validation target must pass before documentation is
regenerated. It still runs the default Go checks, not the optional Python checks;
use `mage check all` to include those. Parallel validation can increase peak
resource use; set `GOMAXPROCS` and `GOFLAGS=-p=<count>` to limit Go concurrency
on memory-constrained hosts.

## Code Generation

The project uses automatic code generation including:
Expand Down
3 changes: 2 additions & 1 deletion docs/user/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,10 @@
- [Create a Project](./how-to/create-project.md) — set up a new Azure Linux project
- [Add a Component](./how-to/add-component.md) — import or create a new package
- [Build a Component](./how-to/build-component.md) — build RPMs from component definitions
- [Extract a Dist-Git Repository](./how-to/extract-dist-git-repo.md) — export a component's committed files and history
- [Build an Image](./how-to/build-image.md) — build and boot Azure Linux images
- [Set Up AI Coding Agents](./how-to/set-up-ai-agents.md) — emit agent skill and instruction files
- [Preview the Lock-File-Free Mode](./how-to/preview-without-lockfile.md) — opt in to `--without-lockfile`
- [Preview the Lock-File-Free Mode](./how-to/preview-without-lockfile.md) — select lockless components

## Explanation

Expand Down
2 changes: 1 addition & 1 deletion docs/user/explanation/config-system.md
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ Component definitions are merged additively. If the same component name (e.g., `

> **Note:** Slice fields (like `overlays`) are **appended**, not replaced, following the same merge behavior used by component configuration inheritance.

> **Preview:** With the global `--without-lockfile` flag, component definitions merge with override semantics instead, and component validation runs only after every included file has been merged, so an individual file may hold a partial component definition. See [Preview the Lock-File-Free Mode](../how-to/preview-without-lockfile.md).
> **Preview:** Components listed in `lockless-components.txt` beside the top-level `azldev.toml` merge with override semantics instead, and their validation runs only after every included file has been merged, so an individual file may hold a partial component definition. Unlisted components retain additive merging and per-file validation. See [Preview the Lock-File-Free Mode](../how-to/preview-without-lockfile.md).

### Component Groups and Images

Expand Down
9 changes: 9 additions & 0 deletions docs/user/how-to/build-component.md
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,15 @@ Built packages are placed in structured subdirectories under the project's outpu

## Common Options

For components listed in `lockless-components.txt`, render and commit first.
Build extracts the committed component dist-git history using `git-filter-repo`,
fetches configured source files (including download and custom origins), downloads
remaining manifest payloads from lookaside, and builds the SRPM with Mock's `rpmautospec` plugin.
Install `git-filter-repo` and Mock 5.3 or newer. Uncommitted rendered edits are
ignored. Lockless builds reject `--without-git` and `--rpmdev-bumpspec`;
lock-file-based builds are unchanged. See the
[lockless workflow](preview-without-lockfile.md#preparing-querying-and-building-committed-dist-git).

| Flag | Description |
|------|-------------|
| `--no-check` | Skip the `%check` section (package test suite) |
Expand Down
65 changes: 65 additions & 0 deletions docs/user/how-to/extract-dist-git-repo.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# How To: Extract a Component's Dist-Git Repository

Use `azldev comp dist-git-repo` to extract one component's committed rendered
files and their Git history from the local project into a standalone repository.
This works for both locked and lockless components.

Install **git-filter-repo** first. If `git filter-repo --version` is unavailable,
the command fails with an installation message before replacing any output.

## Extract a component

Specify exactly one component name and a required output directory:

```bash
azldev comp dist-git-repo curl -o ./dist-git/curl
```

`--output-dir` is the long form of `-o`. Relative output paths are relative to
your current working directory. To select a project elsewhere, use the global
`-C` option:

```bash
azldev -C /path/to/project comp dist-git-repo curl -o ./dist-git/curl
```

The command clones the local project repository's current branch using
`git clone --single-branch --no-local`. It then runs
`git filter-repo --subdirectory-filter` in the clone, selecting:

```text
<project.rendered-specs-dir>/<lowercase-first-letter>/<component-name>
```

The path passed to the filter is relative to the project repository's Git root.
For example, `project.rendered-specs-dir = "specs"` selects `specs/c/curl`;
`SLOF` selects `specs/s/SLOF`. A configured nested rendered-specs directory is
respected.

The selected files become the standalone repository's root:

```bash
git -C ./dist-git/curl log --oneline
ls ./dist-git/curl
```

Only committed content is exported. This command does not render files, refresh pins,
or fetch the component's upstream Fedora/dist-git repository. Render and commit
changes first if you want them included.

## Replace an existing output

Even an empty existing directory is rejected unless you provide `--force`:

```bash
azldev comp dist-git-repo curl --output-dir ./dist-git/curl --force
```

**`--force` deletes the existing output directory and its contents.** Prerequisite,
source-path, and output-safety checks run before deletion. The source
repository and home directory (including their ancestors), Git metadata, and paths
containing symbolic links are not allowed as destinations.

If cloning or filtering fails, any partial output remains for inspection.
Resolve the cause and retry with `--force`. A global `--dry-run` makes no
filesystem changes and does not run Git commands.
Loading