Tempify erzeugt Projekt-Templates auf Basis von Lua-Manifests, Fragen, Hooks und eingebettetem Prebyte-Rendering.
Prebyte wird nicht im Repo vendort. Tempify zieht beim ersten Configure standardmaessig gepinntes Prebyte von GitHub und baut dagegen.
cmake -S . -B build
cmake --build buildInstall lokal:
cmake --install build --prefix "$HOME/.local"Voraussetzungen:
- C++23 Compiler
- CMake 3.31+
CLI11gitfuer ersten Configure ohne lokales Prebyte-Override
Lokales Prebyte-Override:
cmake -S . -B build -DTEMPIFY_PREBYTE_SOURCE_DIR=/abs/pfad/zu/PrebyteTag v*-Releases publizieren:
- Binary-Archive fuer Linux, macOS, Windows jeweils
x86_64undaarch64 .rqp-Pakete fuer Linux und macOS jeweilsx86_64undaarch64index.jsonfuer ReqPack-Repository-Nutzung- Docker-Image
ghcr.io/coditary/tempifyfuerlinux/amd64undlinux/arm64
Namensschema:
tempify-<version>-linux-x86_64.tar.gztempify-<version>-linux-aarch64.tar.gztempify-<version>-macos-x86_64.tar.gztempify-<version>-macos-aarch64.tar.gztempify-<version>-windows-x86_64.ziptempify-<version>-windows-aarch64.ziptempify-cli-<version>-linux-x86_64.rqptempify-cli-<version>-linux-aarch64.rqptempify-cli-<version>-macos-x86_64.rqptempify-cli-<version>-macos-aarch64.rqp
Tempify .rqp installiert:
- Runtime unter
$XDG_DATA_HOME/tempify/runtime/<version>-<release>+r<revision>/ - stabilen Symlink
~/.local/bin/tempify - gebuendeltes ReqPack-Plugin
tempifyunter$XDG_DATA_HOME/reqpack/plugins/tempify/
Naming:
- ReqPack-CLI-Paketname ist
tempify-cli - ReqPack-Plugin-/Systemname fuer Templates bleibt
tempify - dadurch bleibt
rqp install tempify <template-id>konfliktfrei
Beispiel mit lokalem Paket:
rqp install ./dist/tempify-cli-0.1.0-linux-x86_64.rqp --non-interactive
~/.local/bin/tempify --helpBeispiel mit Release-Repository-Index:
rqp install rqp:tempify-cli --non-interactiveHinweis:
- dafuer muss Release-
index.jsonalsrqp-Repository in ReqPack konfiguriert sein - Docker-Image enthaelt nur
tempify, keinrqpund keine auto-installierte ReqPack-Plugin-Registrierung.
Weitere Doku:
docs/README.mddocs/configuration.md
tempify <template-id> [target] [--set key=value ...] [--answers answers.json] [--write-answers answers.json] [-f|--overwrite-if-exists] [-s|--skip-if-file-exists] [--accept-hooks yes|ask|no] [--no-hooks] [--non-interactive] [--strict] [--hook-timeout-ms ms] [--diff|--reapply|--dry-run|--plan-json] [--tui]
tempify reapply <template-id> <target> [--set key=value ...] [--answers answers.json] [--non-interactive] [--strict] [--hook-timeout-ms ms] [--report] [--json] [--tui]
tempify <template-id> -q|--questions [--json] [--full]
tempify list
tempify refresh
tempify process [prebyte-args...]
tempify -p [prebyte-args...]# Lokale Templates anzeigen
./build/tempify list
# Template rendern
./build/tempify basic_cpp my-app \
--set project_name="My App" \
--set name_slug=my-app \
--set namespace=app
# In existierenden Ordner rendern und Konflikte ueberschreiben
./build/tempify basic_cpp my-app -f \
--set project_name="My App" \
--set name_slug=my-app \
--set namespace=app
# In existierenden Ordner rendern und bestehende Dateien behalten
./build/tempify basic_cpp my-app -s \
--set project_name="My App" \
--set name_slug=my-app \
--set namespace=app
# Reapply-Plan als JSON ohne Writes
./build/tempify reapply basic_cpp my-app --report --json \
--set project_name="My App" \
--set name_slug=my-app \
--set namespace=app
# Sichere Reapply-Aenderungen anwenden
./build/tempify reapply basic_cpp my-app --json \
--set project_name="My App" \
--set name_slug=my-app \
--set namespace=app
# Fragen minimal anzeigen
./build/tempify advanced_hooks_layout --questions
# Fragen als JSON ausgeben
./build/tempify advanced_hooks_layout --questions --json
# Fragen mit allen Feldern ausgeben
./build/tempify advanced_hooks_layout --questions --full
# Shared-Template-Index neu aufbauen
./build/tempify refresh
# Prebyte-CLI durchreichen
./build/tempify process -h
# Prebyte-CLI Alias
./build/tempify -p -hlist: zeigt verfuegbare lokale Templates<template-id> -q,<template-id> --questions: zeigt standardmaessig knappe Fragen-Uebersichtrefresh: baut Shared-Template-Index unter lokalem Tempify-Datenpfad neu aufprocess: reicht Restargumente an eingebettetes Prebyte weiter--json: gibt Fragen als JSON aus--full: zeigt auch leere Felder wiechoices: []oderhelp: ""--answers <path>: laedt Fragenwerte aus JSON-Datei--write-answers <path>: schreibt aufgeloeste Fragenwerte als JSON-Datei--non-interactive: scheitert statt fehlende Werte interaktiv zu fragen--strict: lehnt unbekannte oder ungueltige importierte Werte ab--set key=value: setzt Template-Werte direkt ueber CLI-f,--overwrite-if-exists: erlaubt existierendes Ziel und ersetzt kollidierende Dateien-s,--skip-if-file-exists: erlaubt existierendes Ziel und ueberspringt kollidierende Dateien--accept-hooks yes|ask|no: steuert, ob Template-Hooks laufen--no-hooks: Alias fuer--accept-hooks no--hook-timeout-ms <ms>: bricht lange Hook-Phasen nach Timeout ab,0deaktiviert Timeout--diff: zeigt report-only Unterschiede fuer gemanagte Dateien, Origin-Metadaten und Update-Kind an und schreibt nichts--reapply: wendet nur sicherecreate/update/delete-Aenderungen auf existierende Ziele mit passender.tempify-lock.jsonan--report: gibt mit--reapplynur Report aus, ohne Writesreapply: top-level Alias fuertempify <template-id> <target> --reapply--dry-run,--plan-json: zeigt Plan ohne Dateien zu schreiben--tui: nutzt Wizard-Frontend-p,--prebyte: Alias fuerprocess
Reapply-Hinweise:
--reapplybraucht explizites Ziel und vorhandene.tempify-lock.jsontempify reapply <template-id> <target>nutzt exakt dieselbe Reapply-Logik wie Flag-Flow--reapplyblockiert cross-template Reapply, wenn Lockfile-Template nicht zum angeforderten Template passt--reapplyerlaubt Patch-/Prerelease-Upgrades, blockiert aber Major-Upgrades, Pre-1.0-Minor-Upgrades, Downgrades und nicht eindeutig vergleichbare Versionswechsel zur Review- blockiert hart bei
conflictoderreview - behaelt lokale Edits mit Aktion
keep - fuehrt in erstem Slice keine Hooks aus
--diff --json,--reapply --report --jsonund--reapply --jsonzeigen Origin-Template, Origin-Version und Update-Kind- JSON zeigt unter
update.policyauch Action, Reason und Next-Step
--diff Textausgabe enthaelt ausserdem eine direkte Handlungsempfehlung je update.kind.
Erfolgreiches --reapply --json:
{
"status": "ok",
"mode": "reapply",
"template": {
"id": "basic_cpp",
"version": "0.1.0"
},
"origin": {
"detected": true,
"matches_requested_template": true,
"matches_requested_version": false,
"template_id": "basic_cpp",
"template_version": "0.1.0-rc.1"
},
"update": {
"kind": "upgrade",
"from_version": "0.1.0-rc.1",
"to_version": "0.1.0",
"policy": {
"action": "allow",
"reason": "forward_version_change",
"next_step": "Version upgrade detected. Review diff, then reapply ready actions to move managed files forward."
}
}
}Blockiertes --reapply --json bei Template-Mismatch:
{
"status": "error",
"code": "REAPPLY_BLOCKED",
"blocked": {
"conflict": [],
"review": [
".tempify-lock.json"
],
"origin_mismatch": {
"lockfile": ".tempify-lock.json",
"origin_template": {
"id": "layered_cpp_product",
"version": "0.1.0"
},
"requested_template": {
"id": "basic_cpp",
"version": "0.1.0"
}
},
"version_transition": null
}
}Ausfuehrlichere Beispiele: docs/reapply.md
Answers-Dateien:
--answers <path>importiert Fragenwerte aus JSON--write-answers <path>exportiert aufgeloeste Fragenwerte fuer spaetere Replays--strictmacht unbekannte oder ungueltige importierte Werte fatal
Config-Dateien:
- global:
$XDG_CONFIG_HOME/tempify/config.json - global fallback:
~/.config/tempify/config.json - workspace: naechste
.tempify/config.json, aufwaerts ab aktuellem Arbeitsverzeichnis gesucht
Aktuelles Config-Schema:
{
"defaults": {
"project_name": "My App",
"include_ci": false
},
"render": {
"accept_hooks": "ask",
"hook_timeout_ms": 30000,
"existing_path_behavior": "skip"
}
}Fragenwert-Prioritaet, niedrig nach hoch:
- Fragen-Defaults und abgeleitete Defaults
- Template-
.env - globale Config
defaults - Workspace-Config
defaults --answers- CLI
--set
Render-Prioritaet, niedrig nach hoch:
- globale Config
render - Workspace-Config
render - explizite CLI-Flags
Hinweise:
- Config ist aktuell Soft-Default-Layer, kein Policy-Lockdown
- Answer-File-Werte schlagen Config-Defaults
- explizite CLI-Werte schlagen Config und Answer-File
Tempify unterstuetzt zusaetzlich zu ./templates auch einen lokalen Shared-Template-Store.
Pfad:
- wenn
XDG_DATA_HOMEgesetzt ist:$XDG_DATA_HOME/tempify - sonst:
~/.local/share/tempify
Struktur:
<shared-root>/
templates/
index/
templates.jsonHinweise:
- Package Manager kann
templates/undindex/templates.jsondirekt verwalten tempify refreshscannttemplates/und erzeugttemplates.jsonselbst neulistzeigt Workspace-Templates und Shared-Templates zusammen an
Ein Template besteht typischerweise aus:
templates/<template-id>/
template.lua
questions.lua
files/Optional koennen je nach Template auch layout.lua, Hook-Skripte und weitere Lua-Dateien vorkommen.
questions.lua ist jetzt gruppiert aufgebaut:
return {
order = { "Project", "CI" },
groups = {
Project = {
{ key = "project_name", type = "string", prompt = "Project name" },
{ key = "project_slug", type = "string" },
},
CI = {
{ key = "include_ci", type = "bool", prompt = "Include CI?" },
},
},
}Regeln:
orderbestimmt Reihenfolge der Gruppengroupsenthaelt Fragen je Gruppe- Fragen setzen
groupnicht mehr selbst; das kommt ausgroups.<name> - jede Gruppe muss in
orderstehen - leere Gruppen sind ungueltig
ctest --test-dir build --output-on-failurePlugin-Checks:
rqp test-plugin --plugin . --preset core