@mriekki/project-forge 1.0.0 → 2.1.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/README.md +135 -135
- package/assets/components.json +33 -33
- package/assets/core/distribution.json +73 -66
- package/assets/deployment/distribution.json +54 -54
- package/assets/generated/ASSEMBLY.json +46 -11
- package/assets/generated/core/core/process/APPLICATION_VERSIONING.md +137 -0
- package/assets/generated/core/core/process/OPERATION_JOURNAL.md +140 -0
- package/assets/generated/core/core/process/PROJECT_FORGE_ENGINEERING_GUIDE.md +3 -3
- package/assets/generated/core/core/process/PROJECT_REQUIREMENTS_EXPORT.md +165 -0
- package/assets/generated/core/core/skills/build/SKILL.md +70 -0
- package/assets/generated/core/core/skills/deploy/SKILL.md +1 -1
- package/assets/generated/core/core/skills/deployment-readiness/SKILL.md +1 -1
- package/assets/generated/core/core/skills/developer-env-mode/SKILL.md +1 -1
- package/assets/generated/core/core/skills/export-requirements/SKILL.md +132 -0
- package/assets/generated/core/core/skills/progress/SKILL.md +2 -2
- package/assets/generated/core/core/skills/project-forge-update/SKILL.md +10 -10
- package/assets/generated/core/core/skills/replatform/SKILL.md +122 -0
- package/assets/generated/core/core/skills/run/SKILL.md +75 -0
- package/assets/generated/core/core/skills/setup/SKILL.md +3 -3
- package/assets/generated/core/core/skills/tear-down/SKILL.md +1 -1
- package/bin/project-forge.mjs +9 -9
- package/package.json +33 -33
- package/src/cli.mjs +150 -150
- package/src/engine.mjs +243 -243
- package/src/package-data.mjs +18 -18
|
@@ -1,54 +1,54 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "greenfield-project",
|
|
3
|
-
"schemaVersion": 1,
|
|
4
|
-
"description": "Reusable deployment tooling for generated Project Forge projects.",
|
|
5
|
-
"mappings": [
|
|
6
|
-
{"source": "distribution/project-forge-deploy.py", "destination": "tools/project-forge-deployment/project-forge-deploy.py"},
|
|
7
|
-
{"source": "src/project_forge_deployment/__init__.py", "destination": "tools/project-forge-deployment/project_forge_deployment/__init__.py"},
|
|
8
|
-
{"source": "src/project_forge_deployment/__main__.py", "destination": "tools/project-forge-deployment/project_forge_deployment/__main__.py"},
|
|
9
|
-
{"source": "src/project_forge_deployment/app_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_cli.py"},
|
|
10
|
-
{"source": "src/project_forge_deployment/app_runtime.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime.py"},
|
|
11
|
-
{"source": "src/project_forge_deployment/app_runtime_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_remote.py"},
|
|
12
|
-
{"source": "src/project_forge_deployment/app_runtime_workstation.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_workstation.py"},
|
|
13
|
-
{"source": "src/project_forge_deployment/box_platform.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform.py"},
|
|
14
|
-
{"source": "src/project_forge_deployment/box_platform_assets.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform_assets.py"},
|
|
15
|
-
{"source": "src/project_forge_deployment/box_platform_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform_remote.py"},
|
|
16
|
-
{"source": "src/project_forge_deployment/cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/cli.py"},
|
|
17
|
-
{"source": "src/project_forge_deployment/doctor.py", "destination": "tools/project-forge-deployment/project_forge_deployment/doctor.py"},
|
|
18
|
-
{"source": "src/project_forge_deployment/entrypoint.py", "destination": "tools/project-forge-deployment/project_forge_deployment/entrypoint.py"},
|
|
19
|
-
{"source": "src/project_forge_deployment/environment_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_cli.py"},
|
|
20
|
-
{"source": "src/project_forge_deployment/environment_probe.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_probe.py"},
|
|
21
|
-
{"source": "src/project_forge_deployment/errors.py", "destination": "tools/project-forge-deployment/project_forge_deployment/errors.py"},
|
|
22
|
-
{"source": "src/project_forge_deployment/home_lab.py", "destination": "tools/project-forge-deployment/project_forge_deployment/home_lab.py"},
|
|
23
|
-
{"source": "src/project_forge_deployment/image_transfer.py", "destination": "tools/project-forge-deployment/project_forge_deployment/image_transfer.py"},
|
|
24
|
-
{"source": "src/project_forge_deployment/keys.py", "destination": "tools/project-forge-deployment/project_forge_deployment/keys.py"},
|
|
25
|
-
{"source": "src/project_forge_deployment/local_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_cli.py"},
|
|
26
|
-
{"source": "src/project_forge_deployment/local_runtime.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_runtime.py"},
|
|
27
|
-
{"source": "src/project_forge_deployment/local_spec.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_spec.py"},
|
|
28
|
-
{"source": "src/project_forge_deployment/local_sqlite.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_sqlite.py"},
|
|
29
|
-
{"source": "src/project_forge_deployment/portable_profile.py", "destination": "tools/project-forge-deployment/project_forge_deployment/portable_profile.py"},
|
|
30
|
-
{"source": "src/project_forge_deployment/profile_migration.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_migration.py"},
|
|
31
|
-
{"source": "src/project_forge_deployment/profile_repository.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_repository.py"},
|
|
32
|
-
{"source": "src/project_forge_deployment/profiles.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profiles.py"},
|
|
33
|
-
{"source": "src/project_forge_deployment/registry_access.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_access.py"},
|
|
34
|
-
{"source": "src/project_forge_deployment/registry_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_cli.py"},
|
|
35
|
-
{"source": "src/project_forge_deployment/route_registry.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry.py"},
|
|
36
|
-
{"source": "src/project_forge_deployment/route_registry_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry_remote.py"},
|
|
37
|
-
{"source": "src/project_forge_deployment/security.py", "destination": "tools/project-forge-deployment/project_forge_deployment/security.py"},
|
|
38
|
-
{"source": "src/project_forge_deployment/sqlite_adapter.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_adapter.py"},
|
|
39
|
-
{"source": "src/project_forge_deployment/sqlite_adapter_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_adapter_remote.py"},
|
|
40
|
-
{"source": "src/project_forge_deployment/sqlite_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_cli.py"},
|
|
41
|
-
{"source": "src/project_forge_deployment/sqlite_import_recovery.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_import_recovery.py"},
|
|
42
|
-
{"source": "src/project_forge_deployment/ssh.py", "destination": "tools/project-forge-deployment/project_forge_deployment/ssh.py"},
|
|
43
|
-
{"source": "src/project_forge_deployment/teardown.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown.py"},
|
|
44
|
-
{"source": "src/project_forge_deployment/teardown_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown_cli.py"},
|
|
45
|
-
{"source": "src/project_forge_deployment/teardown_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown_remote.py"},
|
|
46
|
-
{"source": "src/project_forge_deployment/trust.py", "destination": "tools/project-forge-deployment/project_forge_deployment/trust.py"},
|
|
47
|
-
{"source": "docs/DEVELOPER_ENVIRONMENTS.md", "destination": "docs/project-forge/DEVELOPER_ENVIRONMENTS.md"},
|
|
48
|
-
{"source": "docs/WORKSPACE_INSTANCES.md", "destination": "docs/project-forge/WORKSPACE_INSTANCES.md"},
|
|
49
|
-
{"source": "docs/ENVIRONMENT_PROOF.md", "destination": "docs/project-forge/ENVIRONMENT_PROOF.md"},
|
|
50
|
-
{"source": "docs/images/developer-environment-journey.svg", "destination": "docs/project-forge/images/developer-environment-journey.svg"},
|
|
51
|
-
{"source": "docs/images/personal-environment-architecture.svg", "destination": "docs/project-forge/images/personal-environment-architecture.svg"},
|
|
52
|
-
{"source": "docs/images/poc-environment-model.svg", "destination": "docs/project-forge/images/poc-environment-model.svg"}
|
|
53
|
-
]
|
|
54
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "greenfield-project",
|
|
3
|
+
"schemaVersion": 1,
|
|
4
|
+
"description": "Reusable deployment tooling for generated Project Forge projects.",
|
|
5
|
+
"mappings": [
|
|
6
|
+
{"source": "distribution/project-forge-deploy.py", "destination": "tools/project-forge-deployment/project-forge-deploy.py"},
|
|
7
|
+
{"source": "src/project_forge_deployment/__init__.py", "destination": "tools/project-forge-deployment/project_forge_deployment/__init__.py"},
|
|
8
|
+
{"source": "src/project_forge_deployment/__main__.py", "destination": "tools/project-forge-deployment/project_forge_deployment/__main__.py"},
|
|
9
|
+
{"source": "src/project_forge_deployment/app_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_cli.py"},
|
|
10
|
+
{"source": "src/project_forge_deployment/app_runtime.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime.py"},
|
|
11
|
+
{"source": "src/project_forge_deployment/app_runtime_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_remote.py"},
|
|
12
|
+
{"source": "src/project_forge_deployment/app_runtime_workstation.py", "destination": "tools/project-forge-deployment/project_forge_deployment/app_runtime_workstation.py"},
|
|
13
|
+
{"source": "src/project_forge_deployment/box_platform.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform.py"},
|
|
14
|
+
{"source": "src/project_forge_deployment/box_platform_assets.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform_assets.py"},
|
|
15
|
+
{"source": "src/project_forge_deployment/box_platform_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/box_platform_remote.py"},
|
|
16
|
+
{"source": "src/project_forge_deployment/cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/cli.py"},
|
|
17
|
+
{"source": "src/project_forge_deployment/doctor.py", "destination": "tools/project-forge-deployment/project_forge_deployment/doctor.py"},
|
|
18
|
+
{"source": "src/project_forge_deployment/entrypoint.py", "destination": "tools/project-forge-deployment/project_forge_deployment/entrypoint.py"},
|
|
19
|
+
{"source": "src/project_forge_deployment/environment_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_cli.py"},
|
|
20
|
+
{"source": "src/project_forge_deployment/environment_probe.py", "destination": "tools/project-forge-deployment/project_forge_deployment/environment_probe.py"},
|
|
21
|
+
{"source": "src/project_forge_deployment/errors.py", "destination": "tools/project-forge-deployment/project_forge_deployment/errors.py"},
|
|
22
|
+
{"source": "src/project_forge_deployment/home_lab.py", "destination": "tools/project-forge-deployment/project_forge_deployment/home_lab.py"},
|
|
23
|
+
{"source": "src/project_forge_deployment/image_transfer.py", "destination": "tools/project-forge-deployment/project_forge_deployment/image_transfer.py"},
|
|
24
|
+
{"source": "src/project_forge_deployment/keys.py", "destination": "tools/project-forge-deployment/project_forge_deployment/keys.py"},
|
|
25
|
+
{"source": "src/project_forge_deployment/local_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_cli.py"},
|
|
26
|
+
{"source": "src/project_forge_deployment/local_runtime.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_runtime.py"},
|
|
27
|
+
{"source": "src/project_forge_deployment/local_spec.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_spec.py"},
|
|
28
|
+
{"source": "src/project_forge_deployment/local_sqlite.py", "destination": "tools/project-forge-deployment/project_forge_deployment/local_sqlite.py"},
|
|
29
|
+
{"source": "src/project_forge_deployment/portable_profile.py", "destination": "tools/project-forge-deployment/project_forge_deployment/portable_profile.py"},
|
|
30
|
+
{"source": "src/project_forge_deployment/profile_migration.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_migration.py"},
|
|
31
|
+
{"source": "src/project_forge_deployment/profile_repository.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profile_repository.py"},
|
|
32
|
+
{"source": "src/project_forge_deployment/profiles.py", "destination": "tools/project-forge-deployment/project_forge_deployment/profiles.py"},
|
|
33
|
+
{"source": "src/project_forge_deployment/registry_access.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_access.py"},
|
|
34
|
+
{"source": "src/project_forge_deployment/registry_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/registry_cli.py"},
|
|
35
|
+
{"source": "src/project_forge_deployment/route_registry.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry.py"},
|
|
36
|
+
{"source": "src/project_forge_deployment/route_registry_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/route_registry_remote.py"},
|
|
37
|
+
{"source": "src/project_forge_deployment/security.py", "destination": "tools/project-forge-deployment/project_forge_deployment/security.py"},
|
|
38
|
+
{"source": "src/project_forge_deployment/sqlite_adapter.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_adapter.py"},
|
|
39
|
+
{"source": "src/project_forge_deployment/sqlite_adapter_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_adapter_remote.py"},
|
|
40
|
+
{"source": "src/project_forge_deployment/sqlite_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_cli.py"},
|
|
41
|
+
{"source": "src/project_forge_deployment/sqlite_import_recovery.py", "destination": "tools/project-forge-deployment/project_forge_deployment/sqlite_import_recovery.py"},
|
|
42
|
+
{"source": "src/project_forge_deployment/ssh.py", "destination": "tools/project-forge-deployment/project_forge_deployment/ssh.py"},
|
|
43
|
+
{"source": "src/project_forge_deployment/teardown.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown.py"},
|
|
44
|
+
{"source": "src/project_forge_deployment/teardown_cli.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown_cli.py"},
|
|
45
|
+
{"source": "src/project_forge_deployment/teardown_remote.py", "destination": "tools/project-forge-deployment/project_forge_deployment/teardown_remote.py"},
|
|
46
|
+
{"source": "src/project_forge_deployment/trust.py", "destination": "tools/project-forge-deployment/project_forge_deployment/trust.py"},
|
|
47
|
+
{"source": "docs/DEVELOPER_ENVIRONMENTS.md", "destination": "docs/project-forge/DEVELOPER_ENVIRONMENTS.md"},
|
|
48
|
+
{"source": "docs/WORKSPACE_INSTANCES.md", "destination": "docs/project-forge/WORKSPACE_INSTANCES.md"},
|
|
49
|
+
{"source": "docs/ENVIRONMENT_PROOF.md", "destination": "docs/project-forge/ENVIRONMENT_PROOF.md"},
|
|
50
|
+
{"source": "docs/images/developer-environment-journey.svg", "destination": "docs/project-forge/images/developer-environment-journey.svg"},
|
|
51
|
+
{"source": "docs/images/personal-environment-architecture.svg", "destination": "docs/project-forge/images/personal-environment-architecture.svg"},
|
|
52
|
+
{"source": "docs/images/poc-environment-model.svg", "destination": "docs/project-forge/images/poc-environment-model.svg"}
|
|
53
|
+
]
|
|
54
|
+
}
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"schemaVersion": 1,
|
|
3
3
|
"package": "@mriekki/project-forge",
|
|
4
|
-
"version": "1.0
|
|
4
|
+
"version": "2.1.0",
|
|
5
5
|
"components": {
|
|
6
6
|
"core": {
|
|
7
7
|
"repository": "mriekki/project-forge-core",
|
|
8
|
-
"commit": "
|
|
9
|
-
"version": "
|
|
8
|
+
"commit": "fd071b9516cb40093f30be41ab695139eb16bb4c",
|
|
9
|
+
"version": "3.3.0",
|
|
10
10
|
"distribution": "greenfield-workspace",
|
|
11
11
|
"files": [
|
|
12
12
|
{
|
|
@@ -62,12 +62,32 @@
|
|
|
62
62
|
{
|
|
63
63
|
"source": "core/skills/setup/SKILL.md",
|
|
64
64
|
"destination": ".github/skills/setup/SKILL.md",
|
|
65
|
-
"sha256": "
|
|
65
|
+
"sha256": "e700e914afc291ffb1153bb796a8ef150c624c5b54032e29d3abda221260285f"
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
"source": "core/skills/build/SKILL.md",
|
|
69
|
+
"destination": ".github/skills/build/SKILL.md",
|
|
70
|
+
"sha256": "0659ad88cac5ca652eedba648d10a39ca1d51d65db638ce41b392067a3fd6128"
|
|
71
|
+
},
|
|
72
|
+
{
|
|
73
|
+
"source": "core/skills/run/SKILL.md",
|
|
74
|
+
"destination": ".github/skills/run/SKILL.md",
|
|
75
|
+
"sha256": "6bdf23f46609d1b85147347d313d7c4bf13bd8bfc91d4b782fc7a311189ffbe3"
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
"source": "core/skills/export-requirements/SKILL.md",
|
|
79
|
+
"destination": ".github/skills/export-requirements/SKILL.md",
|
|
80
|
+
"sha256": "6ef2675eafdbcc809f6fb9533ab41ff032a1f3ff4789b1d5825d27cf696d0715"
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
"source": "core/skills/replatform/SKILL.md",
|
|
84
|
+
"destination": ".github/skills/replatform/SKILL.md",
|
|
85
|
+
"sha256": "86e17bf376f395e5f5f018d8def7f5d99b9f4baef30c0b1d20f5caaac5c993c8"
|
|
66
86
|
},
|
|
67
87
|
{
|
|
68
88
|
"source": "core/skills/progress/SKILL.md",
|
|
69
89
|
"destination": ".github/skills/progress/SKILL.md",
|
|
70
|
-
"sha256": "
|
|
90
|
+
"sha256": "7c9524859f4683feee2e8fac33ef3aa24f2b7b38099a37c3b65eb746aaba7391"
|
|
71
91
|
},
|
|
72
92
|
{
|
|
73
93
|
"source": "core/skills/next-step/SKILL.md",
|
|
@@ -92,7 +112,7 @@
|
|
|
92
112
|
{
|
|
93
113
|
"source": "core/skills/project-forge-update/SKILL.md",
|
|
94
114
|
"destination": ".github/skills/project-forge-update/SKILL.md",
|
|
95
|
-
"sha256": "
|
|
115
|
+
"sha256": "70170e57a77f143c719a8c349161c580e339397e782d28133d9f3734f6625847"
|
|
96
116
|
},
|
|
97
117
|
{
|
|
98
118
|
"source": "core/skills/core-sync/SKILL.md",
|
|
@@ -112,22 +132,22 @@
|
|
|
112
132
|
{
|
|
113
133
|
"source": "core/skills/developer-env-mode/SKILL.md",
|
|
114
134
|
"destination": ".github/skills/developer-env-mode/SKILL.md",
|
|
115
|
-
"sha256": "
|
|
135
|
+
"sha256": "2e45e00e30f17edda5b259bd24852233d2bcace46f7e095d3b28faf9ce35cedb"
|
|
116
136
|
},
|
|
117
137
|
{
|
|
118
138
|
"source": "core/skills/deployment-readiness/SKILL.md",
|
|
119
139
|
"destination": ".github/skills/deployment-readiness/SKILL.md",
|
|
120
|
-
"sha256": "
|
|
140
|
+
"sha256": "846ddacc3f9acaecfce3ba62a6c1eb01149f1afd1013e307a81dc65e1351cbc4"
|
|
121
141
|
},
|
|
122
142
|
{
|
|
123
143
|
"source": "core/skills/deploy/SKILL.md",
|
|
124
144
|
"destination": ".github/skills/deploy/SKILL.md",
|
|
125
|
-
"sha256": "
|
|
145
|
+
"sha256": "7bacd366014bf8c890328ec2b78412a39a0abff2f6b44dd53ca129102a7a30c8"
|
|
126
146
|
},
|
|
127
147
|
{
|
|
128
148
|
"source": "core/skills/tear-down/SKILL.md",
|
|
129
149
|
"destination": ".github/skills/tear-down/SKILL.md",
|
|
130
|
-
"sha256": "
|
|
150
|
+
"sha256": "5fcda93f4a0d1eca76a8a753f340fcb1799bddfe515324493e7d910f1c2253a3"
|
|
131
151
|
},
|
|
132
152
|
{
|
|
133
153
|
"source": "core/skills/coach/SKILL.md",
|
|
@@ -212,13 +232,28 @@
|
|
|
212
232
|
{
|
|
213
233
|
"source": "core/process/PROJECT_FORGE_ENGINEERING_GUIDE.md",
|
|
214
234
|
"destination": "docs/project-forge/PROJECT_FORGE_ENGINEERING_GUIDE.md",
|
|
215
|
-
"sha256": "
|
|
235
|
+
"sha256": "431eb3af7593f5f79f74ffdd306f56b5249a632c480fd6c3e5f0223161d376d9"
|
|
216
236
|
},
|
|
217
237
|
{
|
|
218
238
|
"source": "core/process/SETUP_ACCEPTANCE_CHECKLIST.md",
|
|
219
239
|
"destination": "docs/process/SETUP_ACCEPTANCE_CHECKLIST.md",
|
|
220
240
|
"sha256": "b5f8b39de15b464a1c80b26a6c150c6d2a363751abc05d33df4cebcad6b49d9b"
|
|
221
241
|
},
|
|
242
|
+
{
|
|
243
|
+
"source": "core/process/OPERATION_JOURNAL.md",
|
|
244
|
+
"destination": "docs/process/OPERATION_JOURNAL.md",
|
|
245
|
+
"sha256": "16e2d502d7b0f923b4ea2e34bdcaaed73cdc0933fd6ef54a1278dd25f25b5140"
|
|
246
|
+
},
|
|
247
|
+
{
|
|
248
|
+
"source": "core/process/PROJECT_REQUIREMENTS_EXPORT.md",
|
|
249
|
+
"destination": "docs/process/PROJECT_REQUIREMENTS_EXPORT.md",
|
|
250
|
+
"sha256": "6ef9ecf1bb7c86b5f445554f5e630db36beee34bead2db8ff2597c148fba9c30"
|
|
251
|
+
},
|
|
252
|
+
{
|
|
253
|
+
"source": "core/process/APPLICATION_VERSIONING.md",
|
|
254
|
+
"destination": "docs/process/APPLICATION_VERSIONING.md",
|
|
255
|
+
"sha256": "846abd1085501bebf3ffd8025f875dcf2bfb3f57e67110e684c605ae11c3246b"
|
|
256
|
+
},
|
|
222
257
|
{
|
|
223
258
|
"source": "core/templates/PULL_REQUEST_TEMPLATE.md",
|
|
224
259
|
"destination": ".github/PULL_REQUEST_TEMPLATE.md",
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
# Project Forge Application Versioning
|
|
2
|
+
|
|
3
|
+
Every Project Forge application must implement a real runtime version identity. A static label that never changes across builds is not sufficient.
|
|
4
|
+
|
|
5
|
+
## Contract
|
|
6
|
+
|
|
7
|
+
Application versioning has two layers:
|
|
8
|
+
|
|
9
|
+
1. **release version** — a deliberate Semantic Version such as `0.1.0` or `1.0.0`;
|
|
10
|
+
2. **build identity** — automatically derived evidence that identifies the exact built artifact.
|
|
11
|
+
|
|
12
|
+
The normal human-readable form is intentionally simple:
|
|
13
|
+
|
|
14
|
+
```text
|
|
15
|
+
v1.0.0 (build 142)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
The machine/informational form may carry richer provenance:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
1.0.0+build.142.sha.a1b2c3d
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
A build record should expose equivalent fields when available:
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
releaseVersion: 1.0.0
|
|
28
|
+
buildNumber: 142
|
|
29
|
+
commit: a1b2c3d
|
|
30
|
+
builtAtUtc: 2026-10-21T20:15:00Z
|
|
31
|
+
informationalVersion: 1.0.0+build.142.sha.a1b2c3d
|
|
32
|
+
displayVersion: v1.0.0 (build 142)
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Release version
|
|
36
|
+
|
|
37
|
+
Use Semantic Versioning (`MAJOR.MINOR.PATCH`) for the application release version.
|
|
38
|
+
|
|
39
|
+
Recommended default for a new project under active development:
|
|
40
|
+
|
|
41
|
+
```text
|
|
42
|
+
0.1.0
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
Promote deliberately. The first accepted V1 release may become `1.0.0`; later major/minor/patch changes follow the project's release policy.
|
|
46
|
+
|
|
47
|
+
The release version is expected to remain stable across multiple development builds. It must not be bumped merely to create a unique build identity.
|
|
48
|
+
|
|
49
|
+
Use one stack-native authoritative source for the release version. Do not maintain unrelated duplicated constants or decorative `VERSION.md` values that can drift from the built application.
|
|
50
|
+
|
|
51
|
+
## Build identity
|
|
52
|
+
|
|
53
|
+
A releasable CI-built artifact must receive an automatically derived build identity.
|
|
54
|
+
|
|
55
|
+
Preferred evidence:
|
|
56
|
+
|
|
57
|
+
- monotonically increasing CI/build sequence number;
|
|
58
|
+
- exact source commit, with a short commit acceptable for display and the full commit retained in machine evidence when practical;
|
|
59
|
+
- UTC build timestamp as supplemental evidence.
|
|
60
|
+
|
|
61
|
+
The canonical informational form is conceptually:
|
|
62
|
+
|
|
63
|
+
```text
|
|
64
|
+
<releaseVersion>+build.<buildNumber>.sha.<shortCommit>
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
A timestamp may be appended as metadata, but a date alone should not replace a sequencing value when the build system can provide a monotonic run/build number.
|
|
68
|
+
|
|
69
|
+
For local developer builds where no CI build number exists, use an explicitly non-release identity such as:
|
|
70
|
+
|
|
71
|
+
```text
|
|
72
|
+
0.1.0+local.20261021T201500Z.sha.a1b2c3d
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
Do not invent a CI/release build number for a local build.
|
|
76
|
+
|
|
77
|
+
## Runtime exposure
|
|
78
|
+
|
|
79
|
+
The running application must make its effective version identity observable.
|
|
80
|
+
|
|
81
|
+
For applications with a user interface, expose a concise human-readable value in an appropriate low-noise surface such as About, Settings, diagnostics, or a footer:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
v1.0.0 (build 142)
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
Also provide machine-readable or diagnostic evidence when the stack/application shape supports it, for example:
|
|
88
|
+
|
|
89
|
+
- a version/info endpoint;
|
|
90
|
+
- CLI `--version` output;
|
|
91
|
+
- startup diagnostic metadata;
|
|
92
|
+
- an application metadata object consumed by the UI.
|
|
93
|
+
|
|
94
|
+
The display must be derived from the same build identity as the machine evidence rather than maintained as a separate hard-coded string.
|
|
95
|
+
|
|
96
|
+
## Stack-specific implementation
|
|
97
|
+
|
|
98
|
+
The contract is stack-independent; the implementation is not.
|
|
99
|
+
|
|
100
|
+
Examples of appropriate stack-native sources include:
|
|
101
|
+
|
|
102
|
+
- .NET/Blazor/ASP.NET: project/package version plus assembly/informational version metadata;
|
|
103
|
+
- Node/React/Angular: package/project version plus build-time injected CI/commit metadata;
|
|
104
|
+
- Java/Spring: Maven/Gradle project version plus generated build metadata/resources.
|
|
105
|
+
|
|
106
|
+
These examples are implementation guidance, not a fixed technology requirement. Prefer the repository's native build/package mechanism.
|
|
107
|
+
|
|
108
|
+
## Build and run helpers
|
|
109
|
+
|
|
110
|
+
`/build` should report the effective release/build identity when the selected build produces or exposes it.
|
|
111
|
+
|
|
112
|
+
`/run` should report the effective runtime version when the started application exposes it.
|
|
113
|
+
|
|
114
|
+
Neither helper should invent version information or mutate release version state merely to make version evidence appear.
|
|
115
|
+
|
|
116
|
+
## Delivery and deployment
|
|
117
|
+
|
|
118
|
+
A deployable artifact should be traceable to one version identity and one source commit. Deployment evidence may record the version/build identity, but deployment must not silently rewrite it.
|
|
119
|
+
|
|
120
|
+
A release tag, GitHub release, package version, container tag, or deployment label does not substitute for runtime application version evidence unless the built application actually consumes that same authoritative version metadata.
|
|
121
|
+
|
|
122
|
+
## Replatforming
|
|
123
|
+
|
|
124
|
+
Application versioning is a reusable engineering requirement, not a portable product requirement.
|
|
125
|
+
|
|
126
|
+
`PROJECT_REQUIREMENTS.json` therefore does not need to encode stack-specific version mechanics. A replatformed project must receive the current Project Forge application-versioning contract and implement it using the target stack's native facilities.
|
|
127
|
+
|
|
128
|
+
## Acceptance
|
|
129
|
+
|
|
130
|
+
Application foundation is not complete until:
|
|
131
|
+
|
|
132
|
+
- one authoritative release version source exists;
|
|
133
|
+
- a build can derive a unique build identity without manually editing display text;
|
|
134
|
+
- the source commit is traceable from build evidence;
|
|
135
|
+
- a running application exposes the effective version in an appropriate human-readable form;
|
|
136
|
+
- release/CI builds use a real sequencing value when the CI system provides one;
|
|
137
|
+
- local builds are clearly distinguishable from release/CI builds.
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
# Project Forge Operation Journal
|
|
2
|
+
|
|
3
|
+
Project Forge uses local operation journals to preserve durable, workstation-local evidence for consequential deterministic operations without turning normal read-only guidance into noisy state.
|
|
4
|
+
|
|
5
|
+
## Purpose
|
|
6
|
+
|
|
7
|
+
An operation journal answers:
|
|
8
|
+
|
|
9
|
+
- what deterministic operation ran;
|
|
10
|
+
- when it started and finished;
|
|
11
|
+
- which workspace/platform/provenance it used;
|
|
12
|
+
- which bounded steps ran and their outcomes;
|
|
13
|
+
- where a failure occurred;
|
|
14
|
+
- what final status was reached.
|
|
15
|
+
|
|
16
|
+
The journal is diagnostic evidence. It is not a second workflow database and it does not replace Git, GitHub, CI, deployment state, or human acceptance.
|
|
17
|
+
|
|
18
|
+
## Location
|
|
19
|
+
|
|
20
|
+
Store local journals under the ignored Project Forge cache:
|
|
21
|
+
|
|
22
|
+
```text
|
|
23
|
+
.project-forge/
|
|
24
|
+
logs/
|
|
25
|
+
<operation>/
|
|
26
|
+
<timestamp>-<run-id>.log
|
|
27
|
+
latest.log
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
Examples:
|
|
31
|
+
|
|
32
|
+
```text
|
|
33
|
+
.project-forge/logs/setup/2026-10-20T190523-0700-18432.log
|
|
34
|
+
.project-forge/logs/build/...
|
|
35
|
+
.project-forge/logs/run/...
|
|
36
|
+
.project-forge/logs/project-forge-update/...
|
|
37
|
+
.project-forge/logs/deployment-readiness/...
|
|
38
|
+
.project-forge/logs/deploy/...
|
|
39
|
+
.project-forge/logs/tear-down/...
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
`latest.log` may be a copied summary/current run for convenience. Implementations must not depend on symlink support.
|
|
43
|
+
|
|
44
|
+
Operation journals are workstation-local and must remain ignored by Git. They are never part of `CORE_BASELINE.json`, `PROJECT_FORGE_BASELINE.json`, or application provenance.
|
|
45
|
+
|
|
46
|
+
## Operations that should journal
|
|
47
|
+
|
|
48
|
+
Journal deterministic operations when durable local diagnostics materially help:
|
|
49
|
+
|
|
50
|
+
- `/setup` and repository-local setup/doctor execution;
|
|
51
|
+
- `/build` when build diagnostics/artifact evidence are useful;
|
|
52
|
+
- `/run` as a concise startup/health receipt when useful, not as an unbounded application log sink;
|
|
53
|
+
- `/project-forge-update` apply/verification work;
|
|
54
|
+
- `/developer-env-mode` when it mutates or converges local runtime state;
|
|
55
|
+
- `/deployment-readiness` when it performs preparation or repair;
|
|
56
|
+
- environment proof operations;
|
|
57
|
+
- `/deploy` and `/tear-down`;
|
|
58
|
+
- other bounded deterministic operations that mutate workstation or remote environment state.
|
|
59
|
+
|
|
60
|
+
`/deliver` may write a concise local receipt, but Git commits, PRs, CI, and merge history remain its authoritative durable evidence.
|
|
61
|
+
|
|
62
|
+
Read-only orientation normally does **not** create a journal:
|
|
63
|
+
|
|
64
|
+
- `/progress`;
|
|
65
|
+
- `/next-step`;
|
|
66
|
+
- `/wait-what`;
|
|
67
|
+
- read-only documentation/learning navigation;
|
|
68
|
+
- read-only status checks unless a caller explicitly requests troubleshooting evidence.
|
|
69
|
+
|
|
70
|
+
Remote GitHub Actions already retain their own workflow logs. Do not duplicate complete remote logs locally; record only the local request/provenance/result receipt when useful.
|
|
71
|
+
|
|
72
|
+
## Minimum record
|
|
73
|
+
|
|
74
|
+
A journal should capture, when available:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
operation
|
|
78
|
+
run identifier
|
|
79
|
+
started/finished timestamps
|
|
80
|
+
workspace root or project identity
|
|
81
|
+
platform/architecture
|
|
82
|
+
relevant Project Forge/Core/Bootstrap/Deployment provenance
|
|
83
|
+
step name
|
|
84
|
+
step status
|
|
85
|
+
resolved tool/version evidence
|
|
86
|
+
sanitized command identity
|
|
87
|
+
exit code
|
|
88
|
+
sanitized failure summary
|
|
89
|
+
final status
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
For `/build`, include the requested target and explicit artifact/output paths when the repository build contract establishes them.
|
|
93
|
+
|
|
94
|
+
For `/run`, record only bounded startup evidence such as target, command identity, process/startup result, established local endpoint/health result, and stop guidance. Do not continuously tee long-running application output into the Project Forge journal.
|
|
95
|
+
|
|
96
|
+
Prefer stable event names and compact machine-readable fields inside a human-readable `.log`. JSON Lines is acceptable when the implementation already uses structured events.
|
|
97
|
+
|
|
98
|
+
At completion, report the journal path to the developer when the operation was consequential or when diagnostics were produced.
|
|
99
|
+
|
|
100
|
+
## Security and privacy boundary
|
|
101
|
+
|
|
102
|
+
Operation journals are diagnostic artifacts, not raw transcripts.
|
|
103
|
+
|
|
104
|
+
Never log:
|
|
105
|
+
|
|
106
|
+
- passwords, PATs, API keys, access tokens, private SSH keys, or secret values;
|
|
107
|
+
- credential-manager contents;
|
|
108
|
+
- full process environment dumps;
|
|
109
|
+
- request/response bodies that may contain credentials;
|
|
110
|
+
- arbitrary stdin or secure-prompt contents;
|
|
111
|
+
- known-host private material or mutable application data merely for convenience.
|
|
112
|
+
|
|
113
|
+
Prefer allowlisted structured fields over blind stdout/stderr capture.
|
|
114
|
+
|
|
115
|
+
When command arguments or error text may contain secrets, redact before writing. Implementations should log a command identity such as executable + safe arguments, step name, return code, and a bounded sanitized failure summary rather than blindly teeing every subprocess byte.
|
|
116
|
+
|
|
117
|
+
A local journal must not weaken an existing secure prompt, credential boundary, or Human-in-the-Loop gate.
|
|
118
|
+
|
|
119
|
+
## Lifecycle
|
|
120
|
+
|
|
121
|
+
For a mutating deterministic operation:
|
|
122
|
+
|
|
123
|
+
1. create the journal before the first material mutation;
|
|
124
|
+
2. record operation/provenance preflight;
|
|
125
|
+
3. append bounded step outcomes as work proceeds;
|
|
126
|
+
4. flush useful failure evidence before returning/raising;
|
|
127
|
+
5. record one final state such as `READY`, `SUCCESS`, `DEFERRED`, `BLOCKED`, `FAILED`, or a domain-specific equivalent;
|
|
128
|
+
6. refresh `latest.log` only after the run has a coherent record.
|
|
129
|
+
|
|
130
|
+
A failed operation keeps its timestamped journal. Do not erase failure evidence merely because a later retry succeeds.
|
|
131
|
+
|
|
132
|
+
## Retention
|
|
133
|
+
|
|
134
|
+
Journals are disposable local diagnostics. Project Forge may prune old logs using a conservative size/count policy, but must preserve the current run while it is active and should retain enough recent history to diagnose repeated failures.
|
|
135
|
+
|
|
136
|
+
Do not silently upload operation journals to GitHub, ChatGPT, telemetry, or another machine. A developer may explicitly choose to share a relevant sanitized excerpt when troubleshooting.
|
|
137
|
+
|
|
138
|
+
## Relationship to human acceptance
|
|
139
|
+
|
|
140
|
+
A successful journal entry is machine evidence only. It never marks editor/workspace acceptance, meaningful-diff acceptance, merge authorization, release publication, or production deployment approval on the human's behalf.
|
|
@@ -74,7 +74,7 @@ flowchart TB
|
|
|
74
74
|
|
|
75
75
|
| Layer | Responsibility |
|
|
76
76
|
| --- | --- |
|
|
77
|
-
| POC Bootstrap | Discovery protocol, catalog/support states, approved `
|
|
77
|
+
| POC Bootstrap | Discovery protocol, catalog/support states, approved `PROJECT_BOOTSTRAP.json`, deployment topology intent, deterministic generation, setup/readiness helpers, work-item materialization. |
|
|
78
78
|
| Agentic Core | Reusable workflow behavior, agents/skills, Human-in-the-Loop gates, review/delivery semantics, learning flows, topology-aware deployment orchestration. |
|
|
79
79
|
| Project Forge Platform | Consumer-facing `@mriekki/project-forge` package that assembles exact accepted reusable components and records provenance. |
|
|
80
80
|
| Control Plane | GitHub App orchestration for target validation, short-lived scoped credentials, deterministic generation, and safe publication. |
|
|
@@ -130,7 +130,7 @@ flowchart LR
|
|
|
130
130
|
DELIVER --> MERGE[Merge gate]
|
|
131
131
|
```
|
|
132
132
|
|
|
133
|
-
1. Human approves schema-v2 `
|
|
133
|
+
1. Human approves schema-v2 `PROJECT_BOOTSTRAP.json` with initial work items and an exact `@mriekki/project-forge` package version/profile/integrity.
|
|
134
134
|
2. The private target repository is seeded with only the approved manifest; a public Control Plane request identifies only the repository.
|
|
135
135
|
3. The Control Plane validates the private seed, uses short-lived scoped credentials, obtains the exact package artifact, and verifies integrity before reusable target mutation.
|
|
136
136
|
4. Bootstrap materializes project-owned content; the exact Project Forge package applies its reusable profile only after drift/collision preflight.
|
|
@@ -155,7 +155,7 @@ A project can be generated, set up, and accepted as an engineering workspace eve
|
|
|
155
155
|
| Project definition | Materialized product scope, roadmap, approved work items, architecture/design context, deployment topology, and implementation/learning guidance. |
|
|
156
156
|
| Setup + doctor | Workstation setup and readiness checks stay distinct from human editor/workspace acceptance. A deferred deployment target is not a failed development workspace. |
|
|
157
157
|
| CI baseline | CI exists before substantive implementation and becomes reusable evidence throughout delivery. |
|
|
158
|
-
| Provenance | `
|
|
158
|
+
| Provenance | `PROJECT_BOOTSTRAP.json`, `PROJECT_FORGE_BASELINE.json`, component baselines, `DEV_ENVIRONMENT.json`, and `SCAFFOLD_PLAN.json` make generated state inspectable. |
|
|
159
159
|
|
|
160
160
|
**Important distinction:** machine success is evidence, not human acceptance. Setup and doctor checks can prove tools are ready; the human still decides whether the checkout is actually usable.
|
|
161
161
|
|