Skip to content

Commit e496c07

Browse files
committed
Initial scaffolding — Laravel 13 + Inertia + React design
Repo bootstrap that establishes WHAT this project is before the Laravel install runs. The actual `composer create-project` step is documented in INITIALIZE.md so the bootstrap is reproducible and auditable. What ships in this commit: - README.md, LICENSE (MIT, Simtabi LLC), CHANGELOG.md - CONTRIBUTING.md, SECURITY.md (`opensource@simtabi.com`), CODE_OF_CONDUCT.md (Contributor Covenant 2.1) - .gitignore (Laravel + Node + Claude Code local overrides) - .editorconfig (PSR-12: 4-space PHP, 2-space YAML/JSON, LF) - .github/workflows/ci.yml: PHP 8.3 + 8.4 matrix × Linux/macOS, Node 22 for assets. Jobs skip cleanly when composer.json / package.json aren't present yet so CI doesn't false-fail pre-bootstrap. - .github/dependabot.yml: weekly Monday 06:00 ET on composer, npm, github-actions. - .github/ISSUE_TEMPLATE/{bug_report,feature_request,config}.yml + PULL_REQUEST_TEMPLATE.md adapted from get-installer. - docs/architecture.md: multi-tenant data model, OAuth flow, background workers, signed-URL handoff to the installer, deployment-target trade-offs. - docs/api/v1.yaml: OpenAPI 3.1 spec covering /tenants/me, /registries (list/create/read/update), /audit. Controllers will conform to this once they exist. - docs/decisions.md: ADR index (six pending ADRs queued for post-bootstrap). - INITIALIZE.md: exact `composer create-project laravel/laravel` + Passport + Inertia + React + tenancy bootstrap runbook. Status: pre-implementation. CI runs but skips test jobs until the Laravel install lands.
0 parents  commit e496c07

18 files changed

Lines changed: 1138 additions & 0 deletions

.editorconfig

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
root = true
2+
3+
[*]
4+
charset = utf-8
5+
end_of_line = lf
6+
indent_style = space
7+
indent_size = 4
8+
insert_final_newline = true
9+
trim_trailing_whitespace = true
10+
11+
[*.{yml,yaml,json,jsonc}]
12+
indent_size = 2
13+
14+
[*.md]
15+
trim_trailing_whitespace = false
16+
17+
[Makefile]
18+
indent_style = tab
Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
name: Bug report
2+
description: Something is broken or behaving unexpectedly.
3+
title: "bug: "
4+
labels: [bug]
5+
body:
6+
- type: markdown
7+
attributes:
8+
value: |
9+
Thanks for filing a bug! Please redact any tokens or
10+
credentials before pasting logs.
11+
12+
- type: input
13+
id: version
14+
attributes:
15+
label: get-installer-admin version
16+
description: Output of `get-installer-admin version`.
17+
placeholder: simtabi-get-installer-admin 0.1.0
18+
validations:
19+
required: true
20+
21+
- type: input
22+
id: python
23+
attributes:
24+
label: Python version
25+
placeholder: "3.11.7"
26+
validations:
27+
required: true
28+
29+
- type: dropdown
30+
id: os
31+
attributes:
32+
label: Operating system
33+
options:
34+
- macOS
35+
- Linux
36+
- Windows
37+
- Other (describe in details)
38+
validations:
39+
required: true
40+
41+
- type: textarea
42+
id: what-happened
43+
attributes:
44+
label: What happened?
45+
description: What did you do? What did you expect? What did you get?
46+
placeholder: |
47+
1. ran `get-installer-admin publish --target pypi`
48+
2. expected the package to be uploaded
49+
3. got `token-not-found` although PYPI_TOKEN was set
50+
validations:
51+
required: true
52+
53+
- type: textarea
54+
id: command
55+
attributes:
56+
label: Exact command + relevant config
57+
description: Paste the CLI you ran and the relevant section of release.json (redact tokens).
58+
render: bash
59+
validations:
60+
required: true
61+
62+
- type: textarea
63+
id: logs
64+
attributes:
65+
label: Doctor output / stderr
66+
description: Run `get-installer-admin help` and paste the table; or paste the failing command's stderr.
67+
render: text
68+
69+
- type: checkboxes
70+
id: checks
71+
attributes:
72+
label: Quick checks
73+
options:
74+
- label: I redacted any tokens / credentials before pasting.
75+
required: true
76+
- label: I checked `docs/troubleshooting.md`.
77+
required: true

.github/ISSUE_TEMPLATE/config.yml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
blank_issues_enabled: false
2+
contact_links:
3+
- name: Documentation
4+
url: https://opensource.simtabi.com/documentation/get-installer-admin
5+
about: Manual + per-platform reference playbook.
6+
- name: Security vulnerability
7+
url: https://github.com/simtabi/get-installer-admin/security/policy
8+
about: Use private vulnerability reporting; do not file a public issue.
9+
- name: Discussion / question
10+
url: https://github.com/simtabi/get-installer-admin/discussions
11+
about: Ask questions, share recipes, or propose ideas before formalising.
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
name: Feature request
2+
description: A new platform, CLI verb, or behaviour you'd like to see.
3+
title: "feat: "
4+
labels: [enhancement]
5+
body:
6+
- type: textarea
7+
id: problem
8+
attributes:
9+
label: What problem does this solve?
10+
description: Describe the use case in your own workflow, not the solution.
11+
placeholder: |
12+
I publish to JFrog Artifactory and would like get-installer-admin to
13+
handle it instead of a bespoke script.
14+
validations:
15+
required: true
16+
17+
- type: textarea
18+
id: proposal
19+
attributes:
20+
label: Proposed shape
21+
description: What might the config + CLI look like? Free-form is fine.
22+
placeholder: |
23+
targets:
24+
jfrog:
25+
enabled: true
26+
auth: token
27+
repository: my-repo
28+
29+
- type: dropdown
30+
id: type
31+
attributes:
32+
label: What kind of feature?
33+
options:
34+
- New platform (registry or git host)
35+
- New CLI verb / flag
36+
- New policy / safety check
37+
- Workflow / composition
38+
- Docs / examples
39+
- Other
40+
validations:
41+
required: true
42+
43+
- type: textarea
44+
id: alternatives
45+
attributes:
46+
label: Alternatives considered
47+
description: Have you tried a workaround? What didn't work?
48+
49+
- type: checkboxes
50+
id: willingness
51+
attributes:
52+
label: Contribution
53+
options:
54+
- label: I'd be willing to send a PR for this.

.github/PULL_REQUEST_TEMPLATE.md

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<!-- Thanks for sending a PR! Please redact any tokens before posting logs. -->
2+
3+
## What
4+
5+
<!-- One-paragraph summary of the change. -->
6+
7+
## Why
8+
9+
<!-- The reason this change is needed. Link issues with `Fixes #123` / `Refs #123`. -->
10+
11+
## How
12+
13+
<!-- Notable implementation choices. New platform? Reference the playbook page. -->
14+
15+
## Checklist
16+
17+
- [ ] Tests added or updated; `pytest` passes locally.
18+
- [ ] `ruff check src tests` clean.
19+
- [ ] `mypy src` clean.
20+
- [ ] Public API change? Updated `CHANGELOG.md` under `[Unreleased]`.
21+
- [ ] New platform? Added a `docs/playbook/<group>/<slug>.md` entry following
22+
the 8-section template, and a `docs/platforms/<slug>.md` user page.
23+
- [ ] New CLI verb / flag? Updated `docs/cli.md` and `README.md`.
24+
- [ ] No secrets, tokens, or production hostnames in the diff or logs.

.github/dependabot.yml

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
version: 2
2+
updates:
3+
- package-ecosystem: composer
4+
directory: "/"
5+
schedule:
6+
interval: weekly
7+
day: monday
8+
time: "06:00"
9+
timezone: America/New_York
10+
open-pull-requests-limit: 5
11+
commit-message:
12+
prefix: "deps(php)"
13+
labels:
14+
- dependencies
15+
- php
16+
17+
- package-ecosystem: npm
18+
directory: "/"
19+
schedule:
20+
interval: weekly
21+
day: monday
22+
time: "06:00"
23+
timezone: America/New_York
24+
open-pull-requests-limit: 5
25+
commit-message:
26+
prefix: "deps(js)"
27+
labels:
28+
- dependencies
29+
- javascript
30+
31+
- package-ecosystem: github-actions
32+
directory: "/"
33+
schedule:
34+
interval: weekly
35+
day: monday
36+
time: "06:00"
37+
timezone: America/New_York
38+
open-pull-requests-limit: 5
39+
commit-message:
40+
prefix: "ci"
41+
labels:
42+
- dependencies
43+
- github-actions

.github/workflows/ci.yml

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
name: ci
2+
3+
on:
4+
push:
5+
branches: [main]
6+
pull_request:
7+
branches: [main]
8+
9+
permissions:
10+
contents: read
11+
12+
concurrency:
13+
group: ci-${{ github.ref }}
14+
cancel-in-progress: true
15+
16+
jobs:
17+
php:
18+
name: php ${{ matrix.php }} · ${{ matrix.os }}
19+
strategy:
20+
fail-fast: false
21+
matrix:
22+
os: [ubuntu-latest, macos-latest]
23+
php: ["8.3", "8.4"]
24+
runs-on: ${{ matrix.os }}
25+
steps:
26+
- uses: actions/checkout@v6
27+
28+
- name: Skip if bootstrap not run
29+
id: precheck
30+
run: |
31+
if [ ! -f composer.json ]; then
32+
echo "skip=true" >> "$GITHUB_OUTPUT"
33+
echo "::notice::composer.json not present yet — see INITIALIZE.md"
34+
else
35+
echo "skip=false" >> "$GITHUB_OUTPUT"
36+
fi
37+
38+
- name: Setup PHP
39+
if: steps.precheck.outputs.skip == 'false'
40+
uses: shivammathur/setup-php@v2
41+
with:
42+
php-version: ${{ matrix.php }}
43+
extensions: mbstring, xml, ctype, json, pdo, sqlite, pdo_sqlite, intl
44+
coverage: none
45+
46+
- name: Install
47+
if: steps.precheck.outputs.skip == 'false'
48+
run: composer install --prefer-dist --no-progress --no-interaction
49+
50+
- name: Pint (lint)
51+
if: steps.precheck.outputs.skip == 'false'
52+
run: ./vendor/bin/pint --test
53+
54+
- name: PHPStan (types)
55+
if: steps.precheck.outputs.skip == 'false'
56+
run: ./vendor/bin/phpstan analyse --no-progress
57+
58+
- name: Pest (tests)
59+
if: steps.precheck.outputs.skip == 'false'
60+
run: ./vendor/bin/pest
61+
62+
node:
63+
name: node 22 · assets
64+
runs-on: ubuntu-latest
65+
steps:
66+
- uses: actions/checkout@v6
67+
68+
- name: Skip if bootstrap not run
69+
id: precheck
70+
run: |
71+
if [ ! -f package.json ]; then
72+
echo "skip=true" >> "$GITHUB_OUTPUT"
73+
echo "::notice::package.json not present yet — see INITIALIZE.md"
74+
else
75+
echo "skip=false" >> "$GITHUB_OUTPUT"
76+
fi
77+
78+
- uses: pnpm/action-setup@v4
79+
if: steps.precheck.outputs.skip == 'false'
80+
with:
81+
version: 9
82+
83+
- uses: actions/setup-node@v6
84+
if: steps.precheck.outputs.skip == 'false'
85+
with:
86+
node-version: "22"
87+
cache: pnpm
88+
89+
- run: pnpm install --frozen-lockfile
90+
if: steps.precheck.outputs.skip == 'false'
91+
92+
- run: pnpm lint
93+
if: steps.precheck.outputs.skip == 'false'
94+
95+
- run: pnpm typecheck
96+
if: steps.precheck.outputs.skip == 'false'
97+
98+
- run: pnpm test
99+
if: steps.precheck.outputs.skip == 'false'

.gitignore

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
# Laravel
2+
/vendor
3+
/node_modules
4+
/public/build
5+
/public/hot
6+
/public/storage
7+
/storage/*.key
8+
/storage/pail
9+
/.fleet
10+
/.idea
11+
/.nova
12+
/.vscode
13+
/.zed
14+
/auth.json
15+
npm-debug.log
16+
yarn-error.log
17+
/.phpunit.cache
18+
.phpunit.result.cache
19+
.php-cs-fixer.cache
20+
.phpstan-cache
21+
.psalm-cache
22+
.rector-cache
23+
Homestead.json
24+
Homestead.yaml
25+
26+
# Env / secrets
27+
.env
28+
.env.*.local
29+
.env.backup
30+
.env.production
31+
.env.local
32+
33+
# OS
34+
.DS_Store
35+
Thumbs.db
36+
37+
# Personal Claude Code overrides
38+
.claude/settings.local.json
39+
**/settings.local.json
40+
41+
# Build / coverage
42+
/coverage
43+
/coverage.xml
44+
/.phpunit.cache

0 commit comments

Comments
 (0)