hammerkit 1.6.0 → 1.7.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 +4 -4
- package/build.schema.json +49 -2
- package/dist/cache/backends/local-cache-backend.js +58 -1
- package/dist/cache/backends/registry/registry-client.js +264 -0
- package/dist/cache/backends/registry/registry-credentials.js +81 -0
- package/dist/cache/backends/registry/registry-reference.js +36 -0
- package/dist/cache/backends/registry-cache-backend.js +145 -0
- package/dist/cache/backends/s3-cache-backend.js +99 -46
- package/dist/cache/cache-backend-registry.js +2 -0
- package/dist/cache/cache-inventory.js +84 -0
- package/dist/cache/cache-sync.js +77 -0
- package/dist/cache/explain.js +214 -0
- package/dist/cache/last-resolved.js +48 -0
- package/dist/cache/read-only.js +15 -0
- package/dist/cache/retention.js +61 -0
- package/dist/cli.js +43 -0
- package/dist/docker/using-container.js +5 -1
- package/dist/executer/archive-task-entry.js +21 -0
- package/dist/executer/await-completed-dependencies.js +32 -14
- package/dist/executer/cache-metadata.js +9 -2
- package/dist/executer/docker-service.js +2 -1
- package/dist/executer/docker-task.js +2 -1
- package/dist/executer/dry-run.js +73 -0
- package/dist/executer/event-cache.js +6 -5
- package/dist/executer/execute-command.js +21 -3
- package/dist/executer/execute-work-service.js +10 -1
- package/dist/executer/execute-work-task.js +95 -25
- package/dist/executer/execute-work-tree.js +26 -1
- package/dist/executer/get-scheduler-execute-result.js +4 -1
- package/dist/executer/lazy-resolver.js +15 -3
- package/dist/executer/reset-work-tree.js +2 -0
- package/dist/executer/run-summary.js +102 -0
- package/dist/executer/scheduler/enqueue-next.js +15 -60
- package/dist/executer/scheduler/state-key.js +78 -0
- package/dist/kubernetes/await-running-state.js +73 -19
- package/dist/log.js +16 -6
- package/dist/logging/live-logger.js +2 -1
- package/dist/optimizer/calculate-checksum.js +8 -2
- package/dist/optimizer/get-work-cache-stats.js +66 -16
- package/dist/optimizer/work-task-cache-description.js +34 -5
- package/dist/planner/project-root.js +26 -0
- package/dist/planner/utils/append-work-service.js +2 -1
- package/dist/planner/utils/append-work-task.js +7 -1
- package/dist/planner/utils/parse-work-source.js +35 -30
- package/dist/planner/utils/portable-path.js +30 -0
- package/dist/planner/work-cache-id.js +2 -2
- package/dist/planner/work-graph-serializer.js +103 -0
- package/dist/planner/work-instance-id.js +15 -0
- package/dist/planner/work-runtime-docker.js +53 -15
- package/dist/planner/work-runtime-kubernetes.js +35 -3
- package/dist/planner/work-runtime-local.js +9 -3
- package/dist/planner/work-service-id.js +16 -4
- package/dist/program.js +235 -1
- package/dist/schema/build-file-base-task-schema.js +4 -0
- package/dist/schema/cache-schema.js +21 -2
- package/dist/schema/duration-schema.js +18 -0
- package/dist/schema/reference-parser.js +3 -0
- package/dist/schema/size-schema.js +18 -0
- package/dist/schema/work-scope-parser.js +15 -2
- package/dist/utils/units.js +87 -0
- package/package.json +12 -1
- package/.agents/FEEDBACK.md +0 -74
- package/.agents/skills/before-commit/SKILL.md +0 -101
- package/.agents/skills/do-the-work/SKILL.md +0 -64
- package/.agents/skills/fix-ci/SKILL.md +0 -98
- package/.agents/skills/speckit-git-commit/SKILL.md +0 -53
- package/.agents/skills/speckit-git-feature/SKILL.md +0 -72
- package/.agents/skills/speckit-git-initialize/SKILL.md +0 -54
- package/.agents/skills/speckit-git-remote/SKILL.md +0 -50
- package/.agents/skills/speckit-git-validate/SKILL.md +0 -54
- package/.devcontainer/Dockerfile +0 -5
- package/.devcontainer/devcontainer.json +0 -40
- package/.gitbook.yaml +0 -5
- package/.specify/extensions/.registry +0 -37
- package/.specify/extensions/git/README.md +0 -100
- package/.specify/extensions/git/commands/speckit.git.commit.md +0 -48
- package/.specify/extensions/git/commands/speckit.git.feature.md +0 -67
- package/.specify/extensions/git/commands/speckit.git.initialize.md +0 -49
- package/.specify/extensions/git/commands/speckit.git.remote.md +0 -45
- package/.specify/extensions/git/commands/speckit.git.validate.md +0 -49
- package/.specify/extensions/git/config-template.yml +0 -62
- package/.specify/extensions/git/extension.yml +0 -140
- package/.specify/extensions/git/git-config.yml +0 -62
- package/.specify/extensions.yml +0 -149
- package/.specify/feature.json +0 -3
- package/.specify/init-options.json +0 -10
- package/.specify/integration.json +0 -15
- package/.specify/integrations/claude.manifest.json +0 -16
- package/.specify/integrations/speckit.manifest.json +0 -17
- package/.specify/memory/constitution.md +0 -162
- package/.specify/templates/checklist-template.md +0 -40
- package/.specify/templates/constitution-template.md +0 -50
- package/.specify/templates/plan-template.md +0 -113
- package/.specify/templates/spec-template.md +0 -131
- package/.specify/templates/tasks-template.md +0 -252
- package/.specify/workflows/speckit/workflow.yml +0 -77
- package/.specify/workflows/workflow-registry.json +0 -13
- package/AGENTS.md +0 -94
- package/Dockerfile +0 -32
- package/FOLLOWUPS.md +0 -34
- package/SUMMARY.md +0 -68
- package/VALUES.md +0 -53
- package/dist/cache/auto-pull.spec.js +0 -123
- package/dist/cache/backends/local-cache-backend.spec.js +0 -72
- package/dist/cache/backends/s3-cache-backend.spec.js +0 -118
- package/dist/cache/cache-backend-registry.spec.js +0 -22
- package/dist/cache/resolve-cache.spec.js +0 -52
- package/dist/cli.spec.js +0 -23
- package/dist/console/get-logger.spec.js +0 -23
- package/dist/docker/get-default-platform.spec.js +0 -29
- package/dist/docker/longest-common-prefix.spec.js +0 -26
- package/dist/docker/package.spec.js +0 -145
- package/dist/docker/remove-container.spec.js +0 -32
- package/dist/docker/using-container.spec.js +0 -90
- package/dist/environment/merge-environment-variables.spec.js +0 -24
- package/dist/environment/replace-env-variables.spec.js +0 -47
- package/dist/executer/abort.spec.js +0 -18
- package/dist/executer/environment-mock.spec.js +0 -22
- package/dist/executer/execute.spec.js +0 -51
- package/dist/executer/get-service-containers.spec.js +0 -59
- package/dist/executer/get-service-env-hints.spec.js +0 -65
- package/dist/executer/label-values.spec.js +0 -61
- package/dist/executer/lazy-resolver.spec.js +0 -20
- package/dist/executer/process-manager.spec.js +0 -54
- package/dist/executer/scheduler/enqueue-next.spec.js +0 -136
- package/dist/executer/state-resolver.spec.js +0 -37
- package/dist/executer/state.spec.js +0 -66
- package/dist/executer/states.spec.js +0 -14
- package/dist/file/get-file-context.spec.js +0 -178
- package/dist/file/move-files.spec.js +0 -48
- package/dist/kubernetes/ensure-http-route.spec.js +0 -70
- package/dist/kubernetes/ensure-namespace.spec.js +0 -39
- package/dist/kubernetes/resolve-pod-name.spec.js +0 -81
- package/dist/log.spec.js +0 -131
- package/dist/logging/grouped-logger.spec.js +0 -84
- package/dist/logging/interactive-logger.spec.js +0 -57
- package/dist/logging/live-logger.spec.js +0 -37
- package/dist/logging/loggers.spec.js +0 -154
- package/dist/optimizer/calculate-checksum.spec.js +0 -34
- package/dist/optimizer/get-cache-directory.spec.js +0 -59
- package/dist/optimizer/get-work-cache-stats.spec.js +0 -79
- package/dist/optimizer/work-task-cache-description.spec.js +0 -45
- package/dist/parser/default-build-file.spec.js +0 -48
- package/dist/parser/parse-label-arguments.spec.js +0 -27
- package/dist/parser/read-build-file.spec.js +0 -89
- package/dist/parser/read-env-file.spec.js +0 -42
- package/dist/planner/utils/append-work-service.spec.js +0 -71
- package/dist/planner/utils/get-container-user.spec.js +0 -30
- package/dist/planner/utils/get-default-kube-config.spec.js +0 -11
- package/dist/planner/utils/normalize-path.spec.js +0 -24
- package/dist/planner/utils/parse-work-command.spec.js +0 -21
- package/dist/planner/utils/parse-work-generate.spec.js +0 -45
- package/dist/planner/utils/parse-work-mount.spec.js +0 -62
- package/dist/planner/utils/parse-work-mounts.spec.js +0 -19
- package/dist/planner/utils/parse-work-port.spec.js +0 -24
- package/dist/planner/utils/parse-work-ports.spec.js +0 -24
- package/dist/planner/utils/parse-work-source.spec.js +0 -58
- package/dist/planner/utils/parse-work-volume.spec.js +0 -18
- package/dist/planner/utils/plan-work-tasks.spec.js +0 -30
- package/dist/planner/utils/plan-work-volume.spec.js +0 -33
- package/dist/planner/utils/split-name.spec.js +0 -16
- package/dist/planner/utils/template-value.spec.js +0 -14
- package/dist/planner/validate.spec.js +0 -251
- package/dist/planner/work-cache-id.spec.js +0 -173
- package/dist/planner/work-runtime-local.spec.js +0 -193
- package/dist/program-commands.spec.js +0 -84
- package/dist/program.spec.js +0 -43
- package/dist/schema/build-file-schema.spec.js +0 -61
- package/dist/schema/doc-build-files.spec.js +0 -223
- package/dist/schema/parse-error.spec.js +0 -18
- package/dist/schema/reference-parser.spec.js +0 -83
- package/dist/schema/schema-parser.spec.js +0 -80
- package/dist/schema/type-guards.spec.js +0 -23
- package/dist/schema/work-scope-parser.spec.js +0 -66
- package/dist/service/update-service-status.spec.js +0 -27
- package/dist/testing/ensure-local-registry.js +0 -134
- package/dist/testing/example-test-suite.js +0 -63
- package/dist/testing/expect.js +0 -82
- package/dist/testing/get-test-suite.js +0 -9
- package/dist/testing/http-get.js +0 -21
- package/dist/testing/integration/cache.spec.js +0 -49
- package/dist/testing/integration/cancellation.spec.js +0 -45
- package/dist/testing/integration/clean.spec.js +0 -43
- package/dist/testing/integration/cmd.spec.js +0 -15
- package/dist/testing/integration/concurrency.spec.js +0 -19
- package/dist/testing/integration/docker-package-registry.spec.js +0 -44
- package/dist/testing/integration/docker-service-crash.spec.js +0 -36
- package/dist/testing/integration/docker.spec.js +0 -18
- package/dist/testing/integration/env.spec.js +0 -48
- package/dist/testing/integration/environment.spec.js +0 -97
- package/dist/testing/integration/error.spec.js +0 -19
- package/dist/testing/integration/export.spec.js +0 -22
- package/dist/testing/integration/extend.spec.js +0 -29
- package/dist/testing/integration/glob.spec.js +0 -40
- package/dist/testing/integration/include.spec.js +0 -31
- package/dist/testing/integration/invalid.spec.js +0 -17
- package/dist/testing/integration/invalid_loop.spec.js +0 -56
- package/dist/testing/integration/k8s-state-cache.spec.js +0 -41
- package/dist/testing/integration/kubernetes-service.spec.js +0 -148
- package/dist/testing/integration/kubernetes.spec.js +0 -99
- package/dist/testing/integration/labels.spec.js +0 -42
- package/dist/testing/integration/local.spec.js +0 -14
- package/dist/testing/integration/monorepo.spec.js +0 -15
- package/dist/testing/integration/multi-line.spec.js +0 -17
- package/dist/testing/integration/reference.spec.js +0 -21
- package/dist/testing/integration/services.spec.js +0 -38
- package/dist/testing/integration/store.spec.js +0 -52
- package/dist/testing/integration/unknown.spec.js +0 -28
- package/dist/testing/integration/validate.spec.js +0 -160
- package/dist/testing/integration/watch-dependency.spec.js +0 -33
- package/dist/testing/integration/watch.spec.js +0 -45
- package/dist/testing/requires-kubernetes.js +0 -18
- package/dist/testing/requires-linux-containers.js +0 -18
- package/dist/testing/requires-windows-containers.js +0 -18
- package/dist/testing/test-case.js +0 -75
- package/dist/testing/test-streams.js +0 -28
- package/dist/testing/test-suite-setup.js +0 -3
- package/dist/testing/test-suite.js +0 -3
- package/dist/testing/testing-timeout.js +0 -32
- package/dist/utils/abort-event.spec.js +0 -46
- package/dist/utils/buffer-context.spec.js +0 -38
- package/dist/utils/ci.spec.js +0 -53
- package/dist/utils/debouncer.spec.js +0 -58
- package/dist/utils/emitter.spec.js +0 -34
- package/dist/utils/empty-writable.spec.js +0 -18
- package/dist/utils/environment-config.spec.js +0 -26
- package/dist/utils/fail-never.spec.js +0 -9
- package/dist/utils/sleep.spec.js +0 -22
- package/dist/version.spec.js +0 -12
- package/specs/build-file/caches/spec.md +0 -114
- package/specs/build-file/environment-variables/spec.md +0 -82
- package/specs/build-file/includes/spec.md +0 -60
- package/specs/build-file/references/spec.md +0 -56
- package/specs/build-file/spec.md +0 -62
- package/specs/cli/clean/spec.md +0 -85
- package/specs/cli/down/spec.md +0 -85
- package/specs/cli/execute/spec.md +0 -101
- package/specs/cli/init/spec.md +0 -64
- package/specs/cli/ls/spec.md +0 -66
- package/specs/cli/package/spec.md +0 -110
- package/specs/cli/spec.md +0 -73
- package/specs/cli/store-restore/spec.md +0 -74
- package/specs/cli/up/spec.md +0 -80
- package/specs/cli/validate/spec.md +0 -70
- package/specs/labels/spec.md +0 -91
- package/specs/service/container/spec.md +0 -120
- package/specs/service/kubernetes/spec.md +0 -97
- package/specs/service/spec.md +0 -105
- package/specs/task/caching/spec.md +0 -107
- package/specs/task/container/spec.md +0 -118
- package/specs/task/dependencies/spec.md +0 -70
- package/specs/task/extending/spec.md +0 -74
- package/specs/task/kubernetes/spec.md +0 -125
- package/specs/task/needs/spec.md +0 -59
- package/specs/task/spec.md +0 -87
- package/specs/task/watching/spec.md +0 -69
package/.specify/extensions.yml
DELETED
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
installed:
|
|
2
|
-
- git
|
|
3
|
-
settings:
|
|
4
|
-
auto_execute_hooks: true
|
|
5
|
-
hooks:
|
|
6
|
-
before_constitution:
|
|
7
|
-
- extension: git
|
|
8
|
-
command: speckit.git.initialize
|
|
9
|
-
enabled: true
|
|
10
|
-
optional: false
|
|
11
|
-
prompt: Execute speckit.git.initialize?
|
|
12
|
-
description: Initialize Git repository before constitution setup
|
|
13
|
-
condition: null
|
|
14
|
-
before_specify:
|
|
15
|
-
- extension: git
|
|
16
|
-
command: speckit.git.feature
|
|
17
|
-
enabled: true
|
|
18
|
-
optional: false
|
|
19
|
-
prompt: Execute speckit.git.feature?
|
|
20
|
-
description: Create feature branch before specification
|
|
21
|
-
condition: null
|
|
22
|
-
before_clarify:
|
|
23
|
-
- extension: git
|
|
24
|
-
command: speckit.git.commit
|
|
25
|
-
enabled: true
|
|
26
|
-
optional: true
|
|
27
|
-
prompt: Commit outstanding changes before clarification?
|
|
28
|
-
description: Auto-commit before spec clarification
|
|
29
|
-
condition: null
|
|
30
|
-
before_plan:
|
|
31
|
-
- extension: git
|
|
32
|
-
command: speckit.git.commit
|
|
33
|
-
enabled: true
|
|
34
|
-
optional: true
|
|
35
|
-
prompt: Commit outstanding changes before planning?
|
|
36
|
-
description: Auto-commit before implementation planning
|
|
37
|
-
condition: null
|
|
38
|
-
before_tasks:
|
|
39
|
-
- extension: git
|
|
40
|
-
command: speckit.git.commit
|
|
41
|
-
enabled: true
|
|
42
|
-
optional: true
|
|
43
|
-
prompt: Commit outstanding changes before task generation?
|
|
44
|
-
description: Auto-commit before task generation
|
|
45
|
-
condition: null
|
|
46
|
-
before_implement:
|
|
47
|
-
- extension: git
|
|
48
|
-
command: speckit.git.commit
|
|
49
|
-
enabled: true
|
|
50
|
-
optional: true
|
|
51
|
-
prompt: Commit outstanding changes before implementation?
|
|
52
|
-
description: Auto-commit before implementation
|
|
53
|
-
condition: null
|
|
54
|
-
before_checklist:
|
|
55
|
-
- extension: git
|
|
56
|
-
command: speckit.git.commit
|
|
57
|
-
enabled: true
|
|
58
|
-
optional: true
|
|
59
|
-
prompt: Commit outstanding changes before checklist?
|
|
60
|
-
description: Auto-commit before checklist generation
|
|
61
|
-
condition: null
|
|
62
|
-
before_analyze:
|
|
63
|
-
- extension: git
|
|
64
|
-
command: speckit.git.commit
|
|
65
|
-
enabled: true
|
|
66
|
-
optional: true
|
|
67
|
-
prompt: Commit outstanding changes before analysis?
|
|
68
|
-
description: Auto-commit before analysis
|
|
69
|
-
condition: null
|
|
70
|
-
before_taskstoissues:
|
|
71
|
-
- extension: git
|
|
72
|
-
command: speckit.git.commit
|
|
73
|
-
enabled: true
|
|
74
|
-
optional: true
|
|
75
|
-
prompt: Commit outstanding changes before issue sync?
|
|
76
|
-
description: Auto-commit before tasks-to-issues conversion
|
|
77
|
-
condition: null
|
|
78
|
-
after_constitution:
|
|
79
|
-
- extension: git
|
|
80
|
-
command: speckit.git.commit
|
|
81
|
-
enabled: true
|
|
82
|
-
optional: true
|
|
83
|
-
prompt: Commit constitution changes?
|
|
84
|
-
description: Auto-commit after constitution update
|
|
85
|
-
condition: null
|
|
86
|
-
after_specify:
|
|
87
|
-
- extension: git
|
|
88
|
-
command: speckit.git.commit
|
|
89
|
-
enabled: true
|
|
90
|
-
optional: true
|
|
91
|
-
prompt: Commit specification changes?
|
|
92
|
-
description: Auto-commit after specification
|
|
93
|
-
condition: null
|
|
94
|
-
after_clarify:
|
|
95
|
-
- extension: git
|
|
96
|
-
command: speckit.git.commit
|
|
97
|
-
enabled: true
|
|
98
|
-
optional: true
|
|
99
|
-
prompt: Commit clarification changes?
|
|
100
|
-
description: Auto-commit after spec clarification
|
|
101
|
-
condition: null
|
|
102
|
-
after_plan:
|
|
103
|
-
- extension: git
|
|
104
|
-
command: speckit.git.commit
|
|
105
|
-
enabled: true
|
|
106
|
-
optional: true
|
|
107
|
-
prompt: Commit plan changes?
|
|
108
|
-
description: Auto-commit after implementation planning
|
|
109
|
-
condition: null
|
|
110
|
-
after_tasks:
|
|
111
|
-
- extension: git
|
|
112
|
-
command: speckit.git.commit
|
|
113
|
-
enabled: true
|
|
114
|
-
optional: true
|
|
115
|
-
prompt: Commit task changes?
|
|
116
|
-
description: Auto-commit after task generation
|
|
117
|
-
condition: null
|
|
118
|
-
after_implement:
|
|
119
|
-
- extension: git
|
|
120
|
-
command: speckit.git.commit
|
|
121
|
-
enabled: true
|
|
122
|
-
optional: true
|
|
123
|
-
prompt: Commit implementation changes?
|
|
124
|
-
description: Auto-commit after implementation
|
|
125
|
-
condition: null
|
|
126
|
-
after_checklist:
|
|
127
|
-
- extension: git
|
|
128
|
-
command: speckit.git.commit
|
|
129
|
-
enabled: true
|
|
130
|
-
optional: true
|
|
131
|
-
prompt: Commit checklist changes?
|
|
132
|
-
description: Auto-commit after checklist generation
|
|
133
|
-
condition: null
|
|
134
|
-
after_analyze:
|
|
135
|
-
- extension: git
|
|
136
|
-
command: speckit.git.commit
|
|
137
|
-
enabled: true
|
|
138
|
-
optional: true
|
|
139
|
-
prompt: Commit analysis results?
|
|
140
|
-
description: Auto-commit after analysis
|
|
141
|
-
condition: null
|
|
142
|
-
after_taskstoissues:
|
|
143
|
-
- extension: git
|
|
144
|
-
command: speckit.git.commit
|
|
145
|
-
enabled: true
|
|
146
|
-
optional: true
|
|
147
|
-
prompt: Commit after syncing issues?
|
|
148
|
-
description: Auto-commit after tasks-to-issues conversion
|
|
149
|
-
condition: null
|
package/.specify/feature.json
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "0.8.18",
|
|
3
|
-
"integration_state_schema": 1,
|
|
4
|
-
"installed_integrations": [
|
|
5
|
-
"claude"
|
|
6
|
-
],
|
|
7
|
-
"integration_settings": {
|
|
8
|
-
"claude": {
|
|
9
|
-
"script": "sh",
|
|
10
|
-
"invoke_separator": "-"
|
|
11
|
-
}
|
|
12
|
-
},
|
|
13
|
-
"integration": "claude",
|
|
14
|
-
"default_integration": "claude"
|
|
15
|
-
}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"integration": "claude",
|
|
3
|
-
"version": "0.8.18",
|
|
4
|
-
"installed_at": "2026-05-30T06:27:46.809754+00:00",
|
|
5
|
-
"files": {
|
|
6
|
-
".claude/skills/speckit-analyze/SKILL.md": "2eef0fbff6cad15c9d4714d8986192387811c971a82a1135ab0404f3db0c5e90",
|
|
7
|
-
".claude/skills/speckit-checklist/SKILL.md": "26419fc118dcd9c4e1e977460696a04b7757b8fb0a2d1ff9c64732669deb7977",
|
|
8
|
-
".claude/skills/speckit-clarify/SKILL.md": "35795a017d6d2ed3ace35a333b22e450788e539e24ed5c756d815aa34cd5b6f5",
|
|
9
|
-
".claude/skills/speckit-constitution/SKILL.md": "c1a044aba243ca6aff627fb5e4404feb6f1108d4f7dd174631bee3ae477d6c15",
|
|
10
|
-
".claude/skills/speckit-implement/SKILL.md": "042a0415ce60a5b66adf039da431d9a98cb4897ff330635e0bab0becbbaf3cd2",
|
|
11
|
-
".claude/skills/speckit-plan/SKILL.md": "bad923f08ffd0e61e37da038626bff374386541fb4c69858a5473d6dc302ee17",
|
|
12
|
-
".claude/skills/speckit-specify/SKILL.md": "4cb1cb21f598288859e84cbf29052c1c41f213a2ca42b79b3a6d6293dde99d02",
|
|
13
|
-
".claude/skills/speckit-tasks/SKILL.md": "ca048fadbe29d761c05b497605789656d112a3a9db5f774efcf84503e77a684e",
|
|
14
|
-
".claude/skills/speckit-taskstoissues/SKILL.md": "99bf5ffd90dcb57b63007c7f659a5160a18ce6feb82889895808e2d277abe83b"
|
|
15
|
-
}
|
|
16
|
-
}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"integration": "speckit",
|
|
3
|
-
"version": "0.8.18",
|
|
4
|
-
"installed_at": "2026-05-30T06:27:46.820090+00:00",
|
|
5
|
-
"files": {
|
|
6
|
-
".specify/scripts/bash/common.sh": "0ac0b422fecf41a172a21dc163be1558a87e8a8b885cb48eb9307c99427c4102",
|
|
7
|
-
".specify/scripts/bash/setup-plan.sh": "b23cca3d769a217ab812a6059adb549622471f6893af234cf98ca2019ac4e1a1",
|
|
8
|
-
".specify/scripts/bash/setup-tasks.sh": "7aeee15192a5ab3ba9ff3c3ae450d9994043bf0493c1eabc840da72a9742fc87",
|
|
9
|
-
".specify/scripts/bash/check-prerequisites.sh": "f4541a00257f035aa55a9fede6d964e51e6851c3dc2f81d0a6f367db18944765",
|
|
10
|
-
".specify/scripts/bash/create-new-feature.sh": "bcf4964ca0c6c78717bb42d9e66b8c7e5ee82779cd96afc5aa7b08b75abe5790",
|
|
11
|
-
".specify/templates/constitution-template.md": "ce7549540fa45543cca797a150201d868e64495fdff39dc38246fb17bd4024b3",
|
|
12
|
-
".specify/templates/checklist-template.md": "c37695297e5d3153d64f82c21223509940b13932046c7961c42d1d669516130c",
|
|
13
|
-
".specify/templates/tasks-template.md": "fc29a233f6f5a27ca31f1aa46b596af6500c627441c6e62b2bc4a1d721525842",
|
|
14
|
-
".specify/templates/spec-template.md": "3945437fc35cd30a5b2bf7beea680337c3516826d3efa5a6b92c4a7eca1ba28e",
|
|
15
|
-
".specify/templates/plan-template.md": "cc7f7979cf8d8836ec26492785affd80791d3422a2b745062ec695be8c985ef7"
|
|
16
|
-
}
|
|
17
|
-
}
|
|
@@ -1,162 +0,0 @@
|
|
|
1
|
-
<!--
|
|
2
|
-
SYNC IMPACT REPORT
|
|
3
|
-
Version change: (uninitialized template) → 1.0.0
|
|
4
|
-
Rationale: Initial ratification. Constitution materialized from the canonical
|
|
5
|
-
VALUES.md; no prior versioned principles existed.
|
|
6
|
-
|
|
7
|
-
Modified principles: none (all newly defined)
|
|
8
|
-
Added principles:
|
|
9
|
-
- I. Local-First
|
|
10
|
-
- II. Platform-Agnostic
|
|
11
|
-
- III. One Config, Many Tools
|
|
12
|
-
- IV. Caching Reduces Waste
|
|
13
|
-
- V. Stable Contracts (NON-NEGOTIABLE)
|
|
14
|
-
- VI. Simplicity & Composability
|
|
15
|
-
- VII. Pragmatic Typing
|
|
16
|
-
- VIII. Tests Carry Their Weight (NON-NEGOTIABLE)
|
|
17
|
-
Added sections:
|
|
18
|
-
- Decision Heuristics
|
|
19
|
-
- Development Workflow & Quality Gates
|
|
20
|
-
- Governance
|
|
21
|
-
Removed sections: none
|
|
22
|
-
|
|
23
|
-
Templates reviewed for alignment:
|
|
24
|
-
- .specify/templates/plan-template.md ............ ✅ Constitution Check gate is
|
|
25
|
-
generic ("Gates determined based on constitution file"); Complexity Tracking
|
|
26
|
-
already supports Principle VI / "Add nothing speculative". No edit required.
|
|
27
|
-
- .specify/templates/spec-template.md ............ ✅ No principle conflict. No edit.
|
|
28
|
-
- .specify/templates/tasks-template.md ........... ✅ Tests-optional wording does
|
|
29
|
-
not contradict Principle VIII (which governs the product, not generated
|
|
30
|
-
task lists). No edit required.
|
|
31
|
-
- .specify/templates/checklist-template.md ....... ✅ No principle conflict. No edit.
|
|
32
|
-
|
|
33
|
-
Follow-up TODOs: none. RATIFICATION_DATE set to 2026-05-30 (initial adoption).
|
|
34
|
-
-->
|
|
35
|
-
|
|
36
|
-
# Hammerkit Constitution
|
|
37
|
-
|
|
38
|
-
## Core Principles
|
|
39
|
-
|
|
40
|
-
### I. Local-First
|
|
41
|
-
|
|
42
|
-
Every hammerkit build MUST run on a developer's laptop, not only in CI. A feature that
|
|
43
|
-
functions exclusively inside a CI environment is incomplete. Local execution is the
|
|
44
|
-
primary target; CI is one consumer among many.
|
|
45
|
-
|
|
46
|
-
**Rationale**: A build tool that only runs on CI is broken.
|
|
47
|
-
|
|
48
|
-
### II. Platform-Agnostic
|
|
49
|
-
|
|
50
|
-
Hammerkit MUST NOT couple its core to any single CI/CD provider (GitHub Actions, GitLab
|
|
51
|
-
CI, or otherwise). The same build MUST run anywhere a container runs. Provider-specific
|
|
52
|
-
behavior is prohibited in core and, where genuinely needed, MUST sit behind a clear
|
|
53
|
-
boundary.
|
|
54
|
-
|
|
55
|
-
**Rationale**: Portability across environments is a core promise, not a configuration
|
|
56
|
-
option.
|
|
57
|
-
|
|
58
|
-
### III. One Config, Many Tools
|
|
59
|
-
|
|
60
|
-
A single hammerkit build file MUST be able to replace many tool-specific configs. Changes
|
|
61
|
-
SHOULD reduce config sprawl, not add to it; any new configuration surface MUST justify its
|
|
62
|
-
existence against this goal.
|
|
63
|
-
|
|
64
|
-
**Rationale**: Reducing config sprawl is a feature, not a side effect.
|
|
65
|
-
|
|
66
|
-
### IV. Caching Reduces Waste
|
|
67
|
-
|
|
68
|
-
Caching MUST be evaluated for compute and cost savings, not only wall-clock speed.
|
|
69
|
-
Distributed and smart caching is a first-class concern. Cache-key correctness is
|
|
70
|
-
non-negotiable: a false cache hit (serving stale output as fresh) is a defect, never an
|
|
71
|
-
acceptable trade for speed.
|
|
72
|
-
|
|
73
|
-
**Rationale**: Smart caching saves compute — that matters for cost and footprint, not only
|
|
74
|
-
build time.
|
|
75
|
-
|
|
76
|
-
### V. Stable Contracts (NON-NEGOTIABLE)
|
|
77
|
-
|
|
78
|
-
The CLI surface and the build-file schema are public contracts. Backward-incompatible
|
|
79
|
-
changes to either MUST be deliberate and versioned — never an incidental side effect of a
|
|
80
|
-
refactor. A breaking change requires a MAJOR version bump and migration notes.
|
|
81
|
-
|
|
82
|
-
**Rationale**: Users depend on these contracts; silent breakage erodes trust in the tool.
|
|
83
|
-
|
|
84
|
-
### VI. Simplicity & Composability
|
|
85
|
-
|
|
86
|
-
Prefer small, composable pieces over clever abstractions. If two features can be one, make
|
|
87
|
-
them one. Abstractions, features, and config knobs MUST NOT land without a concrete present
|
|
88
|
-
need (YAGNI).
|
|
89
|
-
|
|
90
|
-
**Rationale**: Composable simplicity keeps the system maintainable and keeps the surface
|
|
91
|
-
area honest.
|
|
92
|
-
|
|
93
|
-
### VII. Pragmatic Typing
|
|
94
|
-
|
|
95
|
-
TypeScript strict mode MUST stay enabled. `any` is permitted where it pulls its weight;
|
|
96
|
-
type purity is a means, not the goal. Type-level cleverness MUST NOT be bought at the cost
|
|
97
|
-
of readability or delivery velocity.
|
|
98
|
-
|
|
99
|
-
**Rationale**: Types exist to serve correctness and developer experience, not the reverse.
|
|
100
|
-
|
|
101
|
-
### VIII. Tests Carry Their Weight (NON-NEGOTIABLE)
|
|
102
|
-
|
|
103
|
-
Quality and coverage are non-negotiable. New behavior ships with tests that would fail
|
|
104
|
-
without it. Slow integration tests are accepted because they buy real confidence. Tests
|
|
105
|
-
MUST NOT be skipped, muted, excluded, `xfail`-ed, or weakened to make a check pass; close
|
|
106
|
-
gaps, do not exclude them.
|
|
107
|
-
|
|
108
|
-
**Rationale**: Real confidence beats a green checkmark earned by lowering the bar.
|
|
109
|
-
|
|
110
|
-
## Decision Heuristics
|
|
111
|
-
|
|
112
|
-
When a judgment call is not settled by a principle above, apply these heuristics (verbatim
|
|
113
|
-
from `VALUES.md`):
|
|
114
|
-
|
|
115
|
-
- **Fix root causes, not symptoms** — A red check is fixed by repairing what's broken, not
|
|
116
|
-
by removing, muting, or weakening the check (no skipped tests, no relaxed lint/prettier
|
|
117
|
-
config to dodge an error).
|
|
118
|
-
- **Real integrations over mocks** — Where feasible, exercise real Docker / real registries
|
|
119
|
-
/ real Kubernetes. Mocks are a last resort, not a default.
|
|
120
|
-
- **Add nothing speculative** — Features, abstractions, and config knobs land when a
|
|
121
|
-
concrete need exists, not for hypothetical futures.
|
|
122
|
-
|
|
123
|
-
## Development Workflow & Quality Gates
|
|
124
|
-
|
|
125
|
-
Every change MUST pass the same gates CI enforces before it merges. Locally these are:
|
|
126
|
-
|
|
127
|
-
- **Formatting** — `prettier --check 'src/**'` (strict: no semicolons, single quotes, 120
|
|
128
|
-
columns, 2-space indent, `es5` trailing commas). `npm run format` to fix.
|
|
129
|
-
- **Linting** — `eslint . --ext .ts`. `no-console` is an error; output MUST route through
|
|
130
|
-
the `Environment` (`stdout`/`stderr`/`console`/`status`), never `console.*` in `src/`.
|
|
131
|
-
- **Typecheck / build** — `tsc -b tsconfig.json` (this also typechecks spec files).
|
|
132
|
-
- **Unit suite** — `CI=true npm test`. The `CI=true` flag matches CI; container/k8s suites
|
|
133
|
-
gate themselves on their env flags and no-op when unset.
|
|
134
|
-
- **Integration suite** — `jest --config jest.integration.config.ts` exercises real
|
|
135
|
-
Docker / registries / Kubernetes per Principle VIII and the Decision Heuristics.
|
|
136
|
-
|
|
137
|
-
Coverage MUST NOT regress. Code review MUST verify compliance with these principles, and
|
|
138
|
-
any added complexity MUST be justified (see the plan template's Complexity Tracking).
|
|
139
|
-
|
|
140
|
-
## Governance
|
|
141
|
-
|
|
142
|
-
This constitution supersedes ad-hoc practice. When guidance conflicts, the constitution
|
|
143
|
-
wins; deviations require explicit justification in the pull request.
|
|
144
|
-
|
|
145
|
-
**Amendments** MUST be proposed via pull request, recorded in the Sync Impact Report at the
|
|
146
|
-
top of this file, and version-bumped per the policy below. Material principle changes SHOULD
|
|
147
|
-
note migration impact for dependent templates and docs.
|
|
148
|
-
|
|
149
|
-
**Versioning policy** (for this constitution):
|
|
150
|
-
|
|
151
|
-
- **MAJOR** — Backward-incompatible governance or principle removal/redefinition.
|
|
152
|
-
- **MINOR** — A new principle or section, or materially expanded guidance.
|
|
153
|
-
- **PATCH** — Clarifications, wording, and non-semantic refinements.
|
|
154
|
-
|
|
155
|
-
**Compliance**: PRs and reviews MUST verify alignment with these principles. Unjustified
|
|
156
|
-
violations block merge.
|
|
157
|
-
|
|
158
|
-
**Runtime guidance**: `VALUES.md` is the canonical statement of intent and the source of
|
|
159
|
-
these principles. Day-to-day agent operating rules live in `AGENTS.md`; durable corrections
|
|
160
|
-
live in `.agents/FEEDBACK.md`. Read those for operational detail; this document governs.
|
|
161
|
-
|
|
162
|
-
**Version**: 1.0.0 | **Ratified**: 2026-05-30 | **Last Amended**: 2026-05-30
|
|
@@ -1,40 +0,0 @@
|
|
|
1
|
-
# [CHECKLIST TYPE] Checklist: [FEATURE NAME]
|
|
2
|
-
|
|
3
|
-
**Purpose**: [Brief description of what this checklist covers]
|
|
4
|
-
**Created**: [DATE]
|
|
5
|
-
**Feature**: [Link to spec.md or relevant documentation]
|
|
6
|
-
|
|
7
|
-
**Note**: This checklist is generated by the `/speckit-checklist` command based on feature context and requirements.
|
|
8
|
-
|
|
9
|
-
<!--
|
|
10
|
-
============================================================================
|
|
11
|
-
IMPORTANT: The checklist items below are SAMPLE ITEMS for illustration only.
|
|
12
|
-
|
|
13
|
-
The /speckit-checklist command MUST replace these with actual items based on:
|
|
14
|
-
- User's specific checklist request
|
|
15
|
-
- Feature requirements from spec.md
|
|
16
|
-
- Technical context from plan.md
|
|
17
|
-
- Implementation details from tasks.md
|
|
18
|
-
|
|
19
|
-
DO NOT keep these sample items in the generated checklist file.
|
|
20
|
-
============================================================================
|
|
21
|
-
-->
|
|
22
|
-
|
|
23
|
-
## [Category 1]
|
|
24
|
-
|
|
25
|
-
- [ ] CHK001 First checklist item with clear action
|
|
26
|
-
- [ ] CHK002 Second checklist item
|
|
27
|
-
- [ ] CHK003 Third checklist item
|
|
28
|
-
|
|
29
|
-
## [Category 2]
|
|
30
|
-
|
|
31
|
-
- [ ] CHK004 Another category item
|
|
32
|
-
- [ ] CHK005 Item with specific criteria
|
|
33
|
-
- [ ] CHK006 Final item in this category
|
|
34
|
-
|
|
35
|
-
## Notes
|
|
36
|
-
|
|
37
|
-
- Check items off as completed: `[x]`
|
|
38
|
-
- Add comments or findings inline
|
|
39
|
-
- Link to relevant resources or documentation
|
|
40
|
-
- Items are numbered sequentially for easy reference
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
# [PROJECT_NAME] Constitution
|
|
2
|
-
<!-- Example: Spec Constitution, TaskFlow Constitution, etc. -->
|
|
3
|
-
|
|
4
|
-
## Core Principles
|
|
5
|
-
|
|
6
|
-
### [PRINCIPLE_1_NAME]
|
|
7
|
-
<!-- Example: I. Library-First -->
|
|
8
|
-
[PRINCIPLE_1_DESCRIPTION]
|
|
9
|
-
<!-- Example: Every feature starts as a standalone library; Libraries must be self-contained, independently testable, documented; Clear purpose required - no organizational-only libraries -->
|
|
10
|
-
|
|
11
|
-
### [PRINCIPLE_2_NAME]
|
|
12
|
-
<!-- Example: II. CLI Interface -->
|
|
13
|
-
[PRINCIPLE_2_DESCRIPTION]
|
|
14
|
-
<!-- Example: Every library exposes functionality via CLI; Text in/out protocol: stdin/args → stdout, errors → stderr; Support JSON + human-readable formats -->
|
|
15
|
-
|
|
16
|
-
### [PRINCIPLE_3_NAME]
|
|
17
|
-
<!-- Example: III. Test-First (NON-NEGOTIABLE) -->
|
|
18
|
-
[PRINCIPLE_3_DESCRIPTION]
|
|
19
|
-
<!-- Example: TDD mandatory: Tests written → User approved → Tests fail → Then implement; Red-Green-Refactor cycle strictly enforced -->
|
|
20
|
-
|
|
21
|
-
### [PRINCIPLE_4_NAME]
|
|
22
|
-
<!-- Example: IV. Integration Testing -->
|
|
23
|
-
[PRINCIPLE_4_DESCRIPTION]
|
|
24
|
-
<!-- Example: Focus areas requiring integration tests: New library contract tests, Contract changes, Inter-service communication, Shared schemas -->
|
|
25
|
-
|
|
26
|
-
### [PRINCIPLE_5_NAME]
|
|
27
|
-
<!-- Example: V. Observability, VI. Versioning & Breaking Changes, VII. Simplicity -->
|
|
28
|
-
[PRINCIPLE_5_DESCRIPTION]
|
|
29
|
-
<!-- Example: Text I/O ensures debuggability; Structured logging required; Or: MAJOR.MINOR.BUILD format; Or: Start simple, YAGNI principles -->
|
|
30
|
-
|
|
31
|
-
## [SECTION_2_NAME]
|
|
32
|
-
<!-- Example: Additional Constraints, Security Requirements, Performance Standards, etc. -->
|
|
33
|
-
|
|
34
|
-
[SECTION_2_CONTENT]
|
|
35
|
-
<!-- Example: Technology stack requirements, compliance standards, deployment policies, etc. -->
|
|
36
|
-
|
|
37
|
-
## [SECTION_3_NAME]
|
|
38
|
-
<!-- Example: Development Workflow, Review Process, Quality Gates, etc. -->
|
|
39
|
-
|
|
40
|
-
[SECTION_3_CONTENT]
|
|
41
|
-
<!-- Example: Code review requirements, testing gates, deployment approval process, etc. -->
|
|
42
|
-
|
|
43
|
-
## Governance
|
|
44
|
-
<!-- Example: Constitution supersedes all other practices; Amendments require documentation, approval, migration plan -->
|
|
45
|
-
|
|
46
|
-
[GOVERNANCE_RULES]
|
|
47
|
-
<!-- Example: All PRs/reviews must verify compliance; Complexity must be justified; Use [GUIDANCE_FILE] for runtime development guidance -->
|
|
48
|
-
|
|
49
|
-
**Version**: [CONSTITUTION_VERSION] | **Ratified**: [RATIFICATION_DATE] | **Last Amended**: [LAST_AMENDED_DATE]
|
|
50
|
-
<!-- Example: Version: 2.1.1 | Ratified: 2025-06-13 | Last Amended: 2025-07-16 -->
|
|
@@ -1,113 +0,0 @@
|
|
|
1
|
-
# Implementation Plan: [FEATURE]
|
|
2
|
-
|
|
3
|
-
**Branch**: `[###-feature-name]` | **Date**: [DATE] | **Spec**: [link]
|
|
4
|
-
|
|
5
|
-
**Input**: Feature specification from `/specs/[###-feature-name]/spec.md`
|
|
6
|
-
|
|
7
|
-
**Note**: This template is filled in by the `/speckit-plan` command. See `.specify/templates/plan-template.md` for the execution workflow.
|
|
8
|
-
|
|
9
|
-
## Summary
|
|
10
|
-
|
|
11
|
-
[Extract from feature spec: primary requirement + technical approach from research]
|
|
12
|
-
|
|
13
|
-
## Technical Context
|
|
14
|
-
|
|
15
|
-
<!--
|
|
16
|
-
ACTION REQUIRED: Replace the content in this section with the technical details
|
|
17
|
-
for the project. The structure here is presented in advisory capacity to guide
|
|
18
|
-
the iteration process.
|
|
19
|
-
-->
|
|
20
|
-
|
|
21
|
-
**Language/Version**: [e.g., Python 3.11, Swift 5.9, Rust 1.75 or NEEDS CLARIFICATION]
|
|
22
|
-
|
|
23
|
-
**Primary Dependencies**: [e.g., FastAPI, UIKit, LLVM or NEEDS CLARIFICATION]
|
|
24
|
-
|
|
25
|
-
**Storage**: [if applicable, e.g., PostgreSQL, CoreData, files or N/A]
|
|
26
|
-
|
|
27
|
-
**Testing**: [e.g., pytest, XCTest, cargo test or NEEDS CLARIFICATION]
|
|
28
|
-
|
|
29
|
-
**Target Platform**: [e.g., Linux server, iOS 15+, WASM or NEEDS CLARIFICATION]
|
|
30
|
-
|
|
31
|
-
**Project Type**: [e.g., library/cli/web-service/mobile-app/compiler/desktop-app or NEEDS CLARIFICATION]
|
|
32
|
-
|
|
33
|
-
**Performance Goals**: [domain-specific, e.g., 1000 req/s, 10k lines/sec, 60 fps or NEEDS CLARIFICATION]
|
|
34
|
-
|
|
35
|
-
**Constraints**: [domain-specific, e.g., <200ms p95, <100MB memory, offline-capable or NEEDS CLARIFICATION]
|
|
36
|
-
|
|
37
|
-
**Scale/Scope**: [domain-specific, e.g., 10k users, 1M LOC, 50 screens or NEEDS CLARIFICATION]
|
|
38
|
-
|
|
39
|
-
## Constitution Check
|
|
40
|
-
|
|
41
|
-
*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.*
|
|
42
|
-
|
|
43
|
-
[Gates determined based on constitution file]
|
|
44
|
-
|
|
45
|
-
## Project Structure
|
|
46
|
-
|
|
47
|
-
### Documentation (this feature)
|
|
48
|
-
|
|
49
|
-
```text
|
|
50
|
-
specs/[###-feature]/
|
|
51
|
-
├── plan.md # This file (/speckit-plan command output)
|
|
52
|
-
├── research.md # Phase 0 output (/speckit-plan command)
|
|
53
|
-
├── data-model.md # Phase 1 output (/speckit-plan command)
|
|
54
|
-
├── quickstart.md # Phase 1 output (/speckit-plan command)
|
|
55
|
-
├── contracts/ # Phase 1 output (/speckit-plan command)
|
|
56
|
-
└── tasks.md # Phase 2 output (/speckit-tasks command - NOT created by /speckit-plan)
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
### Source Code (repository root)
|
|
60
|
-
<!--
|
|
61
|
-
ACTION REQUIRED: Replace the placeholder tree below with the concrete layout
|
|
62
|
-
for this feature. Delete unused options and expand the chosen structure with
|
|
63
|
-
real paths (e.g., apps/admin, packages/something). The delivered plan must
|
|
64
|
-
not include Option labels.
|
|
65
|
-
-->
|
|
66
|
-
|
|
67
|
-
```text
|
|
68
|
-
# [REMOVE IF UNUSED] Option 1: Single project (DEFAULT)
|
|
69
|
-
src/
|
|
70
|
-
├── models/
|
|
71
|
-
├── services/
|
|
72
|
-
├── cli/
|
|
73
|
-
└── lib/
|
|
74
|
-
|
|
75
|
-
tests/
|
|
76
|
-
├── contract/
|
|
77
|
-
├── integration/
|
|
78
|
-
└── unit/
|
|
79
|
-
|
|
80
|
-
# [REMOVE IF UNUSED] Option 2: Web application (when "frontend" + "backend" detected)
|
|
81
|
-
backend/
|
|
82
|
-
├── src/
|
|
83
|
-
│ ├── models/
|
|
84
|
-
│ ├── services/
|
|
85
|
-
│ └── api/
|
|
86
|
-
└── tests/
|
|
87
|
-
|
|
88
|
-
frontend/
|
|
89
|
-
├── src/
|
|
90
|
-
│ ├── components/
|
|
91
|
-
│ ├── pages/
|
|
92
|
-
│ └── services/
|
|
93
|
-
└── tests/
|
|
94
|
-
|
|
95
|
-
# [REMOVE IF UNUSED] Option 3: Mobile + API (when "iOS/Android" detected)
|
|
96
|
-
api/
|
|
97
|
-
└── [same as backend above]
|
|
98
|
-
|
|
99
|
-
ios/ or android/
|
|
100
|
-
└── [platform-specific structure: feature modules, UI flows, platform tests]
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
**Structure Decision**: [Document the selected structure and reference the real
|
|
104
|
-
directories captured above]
|
|
105
|
-
|
|
106
|
-
## Complexity Tracking
|
|
107
|
-
|
|
108
|
-
> **Fill ONLY if Constitution Check has violations that must be justified**
|
|
109
|
-
|
|
110
|
-
| Violation | Why Needed | Simpler Alternative Rejected Because |
|
|
111
|
-
|-----------|------------|-------------------------------------|
|
|
112
|
-
| [e.g., 4th project] | [current need] | [why 3 projects insufficient] |
|
|
113
|
-
| [e.g., Repository pattern] | [specific problem] | [why direct DB access insufficient] |
|