@hybridlabor-api/aos 4.7.2 → 4.9.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/.agents/agents.md +1 -1
- package/.agents/nodes.json +1 -1
- package/.agents/vendor-manifest.json +23 -1
- package/.claude/agents/godmode-media-eventtech.md +1 -1
- package/.claude/hooks/conventional-commits.mjs +125 -0
- package/.claude/hooks/env-file-protection.mjs +105 -0
- package/.claude/hooks/go-gate.mjs +101 -81
- package/.claude/settings.json +13 -0
- package/.opencode/agents/godmode-media-eventtech.md +1 -1
- package/.opencode/plugins/bdb-aos.js +31 -4
- package/README.de.md +1 -1
- package/README.md +1 -1
- package/README.pt.md +1 -1
- package/THIRD_PARTY_NOTICES.md +88 -0
- package/docs/skills_table.md +1 -1
- package/installer.js +309 -101
- package/package.json +6 -2
- package/packages/aos-cli/README.md +80 -0
- package/packages/aos-cli/bin/aos-cli.mjs +134 -0
- package/packages/aos-cli/core-skills.json +12 -0
- package/packages/aos-cli/extensions/aos.ts +321 -0
- package/packages/aos-cli/package-lock.json +1923 -0
- package/packages/aos-cli/package.json +29 -0
- package/packages/aos-cli/scripts/check-theme.mjs +63 -0
- package/packages/aos-cli/themes/aos.json +97 -0
- package/scripts/build-plugin-manifest.mjs +131 -0
- package/scripts/validate-skills.mjs +81 -6
- package/skills/basic/ao-orchestrator/SKILL.md +116 -0
- package/skills/global_config/agenttrail/SKILL.md +6 -1
- package/skills/global_config/ask-tim/SKILL.md +4 -4
- package/skills/global_config/bash-script-generator/SKILL.md +201 -0
- package/skills/global_config/bash-script-generator/assets/templates/standard-template.sh +96 -0
- package/skills/global_config/bash-script-generator/docs/bash-scripting-guide.md +729 -0
- package/skills/global_config/bash-script-generator/docs/generation-best-practices.md +193 -0
- package/skills/global_config/bash-script-generator/docs/script-patterns.md +566 -0
- package/skills/global_config/bash-script-generator/docs/text-processing-guide.md +437 -0
- package/skills/global_config/bash-script-generator/examples/log-analyzer.sh +92 -0
- package/skills/global_config/bash-script-generator/scripts/generate_script_template.sh +123 -0
- package/skills/global_config/bash-script-generator/scripts/run_ci_checks.sh +172 -0
- package/skills/global_config/bash-script-generator/scripts/test_generator.sh +413 -0
- package/skills/global_config/bash-script-validator/SKILL.md +249 -0
- package/skills/global_config/bash-script-validator/docs/awk-reference.md +449 -0
- package/skills/global_config/bash-script-validator/docs/bash-reference.md +468 -0
- package/skills/global_config/bash-script-validator/docs/common-mistakes.md +623 -0
- package/skills/global_config/bash-script-validator/docs/grep-reference.md +395 -0
- package/skills/global_config/bash-script-validator/docs/regex-reference.md +391 -0
- package/skills/global_config/bash-script-validator/docs/sed-reference.md +454 -0
- package/skills/global_config/bash-script-validator/docs/shell-reference.md +463 -0
- package/skills/global_config/bash-script-validator/docs/shellcheck-reference.md +399 -0
- package/skills/global_config/bash-script-validator/examples/bad-bash.sh +55 -0
- package/skills/global_config/bash-script-validator/examples/bad-shell.sh +54 -0
- package/skills/global_config/bash-script-validator/examples/good-bash.sh +71 -0
- package/skills/global_config/bash-script-validator/examples/good-shell.sh +69 -0
- package/skills/global_config/bash-script-validator/scripts/run_ci_checks.sh +23 -0
- package/skills/global_config/bash-script-validator/scripts/shellcheck_wrapper.sh +174 -0
- package/skills/global_config/bash-script-validator/scripts/test_validate.sh +446 -0
- package/skills/global_config/bash-script-validator/scripts/validate.sh +512 -0
- package/skills/global_config/ci-pipeline/SKILL.md +135 -0
- package/skills/global_config/dispatching-parallel-agents/SKILL.md +170 -0
- package/skills/global_config/dockerfile-generator/SKILL.md +1038 -0
- package/skills/global_config/dockerfile-generator/examples/example.dockerignore +95 -0
- package/skills/global_config/dockerfile-generator/examples/golang-distroless.Dockerfile +34 -0
- package/skills/global_config/dockerfile-generator/examples/java-springboot.Dockerfile +45 -0
- package/skills/global_config/dockerfile-generator/examples/nextjs-production.Dockerfile +49 -0
- package/skills/global_config/dockerfile-generator/examples/nodejs-multistage.Dockerfile +55 -0
- package/skills/global_config/dockerfile-generator/examples/python-fastapi.Dockerfile +48 -0
- package/skills/global_config/dockerfile-generator/references/language_specific_guides.md +510 -0
- package/skills/global_config/dockerfile-generator/references/multistage_builds.md +570 -0
- package/skills/global_config/dockerfile-generator/references/optimization_patterns.md +492 -0
- package/skills/global_config/dockerfile-generator/references/security_best_practices.md +375 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_dockerignore.sh +199 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_golang.sh +172 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_java.sh +185 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_nodejs.sh +279 -0
- package/skills/global_config/dockerfile-generator/scripts/generate_python.sh +218 -0
- package/skills/global_config/dockerfile-generator/scripts/test_generator.sh +210 -0
- package/skills/global_config/dockerfile-validator/SKILL.md +300 -0
- package/skills/global_config/dockerfile-validator/examples/.dockerignore.example +34 -0
- package/skills/global_config/dockerfile-validator/examples/bad-example.Dockerfile +37 -0
- package/skills/global_config/dockerfile-validator/examples/golang-distroless.Dockerfile +50 -0
- package/skills/global_config/dockerfile-validator/examples/good-example.Dockerfile +52 -0
- package/skills/global_config/dockerfile-validator/examples/python-optimized.Dockerfile +53 -0
- package/skills/global_config/dockerfile-validator/examples/security-issues.Dockerfile +42 -0
- package/skills/global_config/dockerfile-validator/references/docker_best_practices.md +348 -0
- package/skills/global_config/dockerfile-validator/references/optimization_guide.md +473 -0
- package/skills/global_config/dockerfile-validator/references/security_checklist.md +208 -0
- package/skills/global_config/dockerfile-validator/scripts/dockerfile-validate.sh +699 -0
- package/skills/global_config/dockerfile-validator/scripts/test_validate.sh +35 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn-lock-read.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/copy-before-yarn.Dockerfile +6 -0
- package/skills/global_config/dockerfile-validator/tests/fixtures/from-platform-nonroot.Dockerfile +7 -0
- package/skills/global_config/dockerfile-validator/tests/test_regression.sh +164 -0
- package/skills/global_config/finishing-a-development-branch/SKILL.md +228 -0
- package/skills/global_config/github-actions-generator/SKILL.md +353 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/composite/action.yml +82 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/Dockerfile +25 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/action.yml +42 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/docker/entrypoint.sh +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/action.yml +33 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/index.js +50 -0
- package/skills/global_config/github-actions-generator/assets/templates/action/javascript/package.json +27 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/basic_workflow.yml +242 -0
- package/skills/global_config/github-actions-generator/assets/templates/workflow/reusable_workflow.yml +106 -0
- package/skills/global_config/github-actions-generator/examples/README.md +147 -0
- package/skills/global_config/github-actions-generator/examples/actions/setup-node-cached/action.yml +93 -0
- package/skills/global_config/github-actions-generator/examples/caching/docker-buildkit.yml +256 -0
- package/skills/global_config/github-actions-generator/examples/security/dependency-review.yml +62 -0
- package/skills/global_config/github-actions-generator/examples/security/sbom-attestation.yml +119 -0
- package/skills/global_config/github-actions-generator/examples/triggers/chatops-commands.yml +475 -0
- package/skills/global_config/github-actions-generator/examples/triggers/repository-dispatch.yml +418 -0
- package/skills/global_config/github-actions-generator/examples/triggers/workflow-orchestration.yml +404 -0
- package/skills/global_config/github-actions-generator/examples/workflows/docker-build-push.yml +68 -0
- package/skills/global_config/github-actions-generator/examples/workflows/go-ci.yml +161 -0
- package/skills/global_config/github-actions-generator/examples/workflows/monorepo-ci.yml +340 -0
- package/skills/global_config/github-actions-generator/examples/workflows/multi-environment-deploy.yml +406 -0
- package/skills/global_config/github-actions-generator/examples/workflows/nodejs-ci.yml +122 -0
- package/skills/global_config/github-actions-generator/examples/workflows/python-ci.yml +157 -0
- package/skills/global_config/github-actions-generator/examples/workflows/scheduled-tasks.yml +376 -0
- package/skills/global_config/github-actions-generator/references/advanced-triggers.md +917 -0
- package/skills/global_config/github-actions-generator/references/best-practices.md +755 -0
- package/skills/global_config/github-actions-generator/references/common-actions.md +715 -0
- package/skills/global_config/github-actions-generator/references/custom-actions.md +320 -0
- package/skills/global_config/github-actions-generator/references/expressions-and-contexts.md +688 -0
- package/skills/global_config/github-actions-generator/references/modern-features.md +421 -0
- package/skills/global_config/github-actions-generator/scripts/test_generator.sh +344 -0
- package/skills/global_config/github-actions-templates/SKILL.md +7 -0
- package/skills/global_config/github-actions-validator/SKILL.md +576 -0
- package/skills/global_config/github-actions-validator/examples/README.md +88 -0
- package/skills/global_config/github-actions-validator/examples/outdated-versions.yml +76 -0
- package/skills/global_config/github-actions-validator/examples/valid-ci.yml +79 -0
- package/skills/global_config/github-actions-validator/examples/with-errors.yml +47 -0
- package/skills/global_config/github-actions-validator/references/act_usage.md +233 -0
- package/skills/global_config/github-actions-validator/references/action_versions.md +122 -0
- package/skills/global_config/github-actions-validator/references/actionlint_usage.md +343 -0
- package/skills/global_config/github-actions-validator/references/common_errors.md +512 -0
- package/skills/global_config/github-actions-validator/references/modern_features.md +384 -0
- package/skills/global_config/github-actions-validator/references/runners.md +317 -0
- package/skills/global_config/github-actions-validator/scripts/install_tools.sh +113 -0
- package/skills/global_config/github-actions-validator/scripts/validate_workflow.sh +910 -0
- package/skills/global_config/github-actions-validator/tests/test_validate_workflow.sh +237 -0
- package/skills/global_config/makefile-generator/SKILL.md +614 -0
- package/skills/global_config/makefile-generator/assets/templates/.gitkeep +1 -0
- package/skills/global_config/makefile-generator/docs/makefile-structure.md +530 -0
- package/skills/global_config/makefile-generator/docs/optimization-guide.md +784 -0
- package/skills/global_config/makefile-generator/docs/patterns-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/security-guide.md +361 -0
- package/skills/global_config/makefile-generator/docs/targets-guide.md +642 -0
- package/skills/global_config/makefile-generator/docs/variables-guide.md +596 -0
- package/skills/global_config/makefile-generator/scripts/add_standard_targets.sh +539 -0
- package/skills/global_config/makefile-generator/scripts/generate_makefile_template.sh +690 -0
- package/skills/global_config/makefile-generator/test/test_helper_scripts.sh +190 -0
- package/skills/global_config/makefile-validator/SKILL.md +244 -0
- package/skills/global_config/makefile-validator/docs/bake-tool.md +1000 -0
- package/skills/global_config/makefile-validator/docs/best-practices.md +858 -0
- package/skills/global_config/makefile-validator/docs/common-mistakes.md +944 -0
- package/skills/global_config/makefile-validator/examples/bad-makefile.mk +77 -0
- package/skills/global_config/makefile-validator/examples/good-makefile.mk +103 -0
- package/skills/global_config/makefile-validator/scripts/test_validate.sh +382 -0
- package/skills/global_config/makefile-validator/scripts/validate_makefile.sh +712 -0
- package/skills/global_config/{MCP_Manage → mcp-manage}/SKILL.md +3 -3
- package/skills/global_config/requesting-code-review/SKILL.md +98 -0
- package/skills/global_config/requesting-code-review/code-reviewer.md +198 -0
- package/skills/global_config/using-git-worktrees/SKILL.md +170 -0
- package/skills/global_config/verification-before-completion/SKILL.md +123 -0
- package/skills/global_config/writing-plans/SKILL.md +126 -46
- package/skills/global_config/writing-plans-legacy/SKILL.md +139 -0
|
@@ -0,0 +1,690 @@
|
|
|
1
|
+
#!/usr/bin/env bash
|
|
2
|
+
#
|
|
3
|
+
# generate_makefile_template.sh
|
|
4
|
+
# Description: Generate Makefile templates for different project types
|
|
5
|
+
# Usage: bash generate_makefile_template.sh [OPTIONS] [PROJECT_TYPE] [PROJECT_NAME] [OUTPUT_FILE]
|
|
6
|
+
#
|
|
7
|
+
|
|
8
|
+
set -euo pipefail
|
|
9
|
+
|
|
10
|
+
# Script metadata
|
|
11
|
+
readonly SCRIPT_NAME="$(basename "${BASH_SOURCE[0]}")"
|
|
12
|
+
readonly SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
13
|
+
|
|
14
|
+
# Default values
|
|
15
|
+
FORCE=0
|
|
16
|
+
PROJECT_TYPE=""
|
|
17
|
+
PROJECT_NAME="myproject"
|
|
18
|
+
OUTPUT_FILE="Makefile"
|
|
19
|
+
|
|
20
|
+
# Colors for output
|
|
21
|
+
if [[ -t 1 ]]; then
|
|
22
|
+
readonly RED='\033[0;31m'
|
|
23
|
+
readonly GREEN='\033[0;32m'
|
|
24
|
+
readonly YELLOW='\033[1;33m'
|
|
25
|
+
readonly NC='\033[0m' # No Color
|
|
26
|
+
else
|
|
27
|
+
readonly RED=''
|
|
28
|
+
readonly GREEN=''
|
|
29
|
+
readonly YELLOW=''
|
|
30
|
+
readonly NC=''
|
|
31
|
+
fi
|
|
32
|
+
|
|
33
|
+
# Print functions
|
|
34
|
+
print_error() {
|
|
35
|
+
echo -e "${RED}ERROR:${NC} $*" >&2
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
print_success() {
|
|
39
|
+
echo -e "${GREEN}SUCCESS:${NC} $*"
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
print_info() {
|
|
43
|
+
echo -e "${YELLOW}INFO:${NC} $*"
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
# Usage information
|
|
47
|
+
usage() {
|
|
48
|
+
cat << EOF
|
|
49
|
+
Usage: ${SCRIPT_NAME} [OPTIONS] [PROJECT_TYPE] [PROJECT_NAME] [OUTPUT_FILE]
|
|
50
|
+
|
|
51
|
+
Generate Makefile templates for different project types.
|
|
52
|
+
|
|
53
|
+
Options:
|
|
54
|
+
-f, --force Overwrite existing files without prompting
|
|
55
|
+
-h, --help Show this help message
|
|
56
|
+
|
|
57
|
+
Arguments:
|
|
58
|
+
PROJECT_TYPE Type of project (required)
|
|
59
|
+
PROJECT_NAME Name of the project (default: myproject)
|
|
60
|
+
OUTPUT_FILE Output file path (default: Makefile)
|
|
61
|
+
|
|
62
|
+
Project Types:
|
|
63
|
+
c Simple C project
|
|
64
|
+
c-lib C library project
|
|
65
|
+
cpp C++ project
|
|
66
|
+
go Go project
|
|
67
|
+
python Python project
|
|
68
|
+
java Java project
|
|
69
|
+
generic Generic project
|
|
70
|
+
|
|
71
|
+
Examples:
|
|
72
|
+
${SCRIPT_NAME} c myapp
|
|
73
|
+
${SCRIPT_NAME} go server Makefile
|
|
74
|
+
${SCRIPT_NAME} python mypackage build.mk
|
|
75
|
+
${SCRIPT_NAME} -f c myapp Makefile # Force overwrite
|
|
76
|
+
|
|
77
|
+
EOF
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
# Parse command line options
|
|
81
|
+
parse_args() {
|
|
82
|
+
local -a positional=()
|
|
83
|
+
|
|
84
|
+
while [[ $# -gt 0 ]]; do
|
|
85
|
+
case "$1" in
|
|
86
|
+
-f|--force)
|
|
87
|
+
FORCE=1
|
|
88
|
+
shift
|
|
89
|
+
;;
|
|
90
|
+
-h|--help)
|
|
91
|
+
usage
|
|
92
|
+
exit 0
|
|
93
|
+
;;
|
|
94
|
+
-*)
|
|
95
|
+
print_error "Unknown option: $1"
|
|
96
|
+
usage
|
|
97
|
+
exit 1
|
|
98
|
+
;;
|
|
99
|
+
*)
|
|
100
|
+
positional+=("$1")
|
|
101
|
+
shift
|
|
102
|
+
;;
|
|
103
|
+
esac
|
|
104
|
+
done
|
|
105
|
+
|
|
106
|
+
if [[ ${#positional[@]} -gt 3 ]]; then
|
|
107
|
+
print_error "Too many positional arguments. Expected: [PROJECT_TYPE] [PROJECT_NAME] [OUTPUT_FILE]"
|
|
108
|
+
usage
|
|
109
|
+
exit 1
|
|
110
|
+
fi
|
|
111
|
+
|
|
112
|
+
if [[ ${#positional[@]} -ge 1 ]]; then
|
|
113
|
+
PROJECT_TYPE="${positional[0]}"
|
|
114
|
+
fi
|
|
115
|
+
if [[ ${#positional[@]} -ge 2 ]]; then
|
|
116
|
+
PROJECT_NAME="${positional[1]}"
|
|
117
|
+
fi
|
|
118
|
+
if [[ ${#positional[@]} -ge 3 ]]; then
|
|
119
|
+
OUTPUT_FILE="${positional[2]}"
|
|
120
|
+
fi
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
# Escape replacement text for sed "s///" usage.
|
|
124
|
+
escape_sed_replacement() {
|
|
125
|
+
printf '%s' "$1" | sed -e 's/[\\/&]/\\&/g'
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
# Render a template from stdin and replace PROJECT_NAME safely.
|
|
129
|
+
render_template_with_project() {
|
|
130
|
+
local project="$1"
|
|
131
|
+
local escaped_project
|
|
132
|
+
escaped_project="$(escape_sed_replacement "$project")"
|
|
133
|
+
sed "s/PROJECT_NAME/${escaped_project}/g"
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
# Generate C project Makefile
|
|
137
|
+
generate_c_makefile() {
|
|
138
|
+
local project="$1"
|
|
139
|
+
render_template_with_project "$project" << 'EOF'
|
|
140
|
+
# Makefile for C project
|
|
141
|
+
SHELL := bash
|
|
142
|
+
.ONESHELL:
|
|
143
|
+
.SHELLFLAGS := -eu -o pipefail -c
|
|
144
|
+
.DELETE_ON_ERROR:
|
|
145
|
+
.SUFFIXES:
|
|
146
|
+
MAKEFLAGS += --warn-undefined-variables
|
|
147
|
+
MAKEFLAGS += --no-builtin-rules
|
|
148
|
+
|
|
149
|
+
PROJECT := PROJECT_NAME
|
|
150
|
+
VERSION := 1.0.0
|
|
151
|
+
|
|
152
|
+
CC ?= gcc
|
|
153
|
+
CFLAGS ?= -Wall -Wextra -O2
|
|
154
|
+
PREFIX ?= /usr/local
|
|
155
|
+
|
|
156
|
+
SRCDIR := src
|
|
157
|
+
BUILDDIR := build
|
|
158
|
+
OBJDIR := $(BUILDDIR)/obj
|
|
159
|
+
|
|
160
|
+
SOURCES := $(wildcard $(SRCDIR)/*.c)
|
|
161
|
+
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
|
|
162
|
+
DEPENDS := $(OBJECTS:.o=.d)
|
|
163
|
+
TARGET := $(BUILDDIR)/$(PROJECT)
|
|
164
|
+
|
|
165
|
+
.PHONY: all clean install test help
|
|
166
|
+
|
|
167
|
+
## Build the application (default)
|
|
168
|
+
all: $(TARGET)
|
|
169
|
+
|
|
170
|
+
$(TARGET): $(OBJECTS)
|
|
171
|
+
@mkdir -p $(@D)
|
|
172
|
+
$(CC) $(LDFLAGS) $^ $(LDLIBS) -o $@
|
|
173
|
+
|
|
174
|
+
$(OBJDIR)/%.o: $(SRCDIR)/%.c
|
|
175
|
+
@mkdir -p $(@D)
|
|
176
|
+
$(CC) $(CPPFLAGS) $(CFLAGS) -MMD -MP -c $< -o $@
|
|
177
|
+
|
|
178
|
+
-include $(DEPENDS)
|
|
179
|
+
|
|
180
|
+
## Install to PREFIX
|
|
181
|
+
install: $(TARGET)
|
|
182
|
+
install -d $(DESTDIR)$(PREFIX)/bin
|
|
183
|
+
install -m 755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/$(PROJECT)
|
|
184
|
+
|
|
185
|
+
## Run tests
|
|
186
|
+
test: $(TARGET)
|
|
187
|
+
@echo "Running tests..."
|
|
188
|
+
@$(TARGET) --test
|
|
189
|
+
|
|
190
|
+
## Remove build artifacts
|
|
191
|
+
clean:
|
|
192
|
+
$(RM) -r $(BUILDDIR)
|
|
193
|
+
|
|
194
|
+
## Show help
|
|
195
|
+
help:
|
|
196
|
+
@echo "$(PROJECT) v$(VERSION)"
|
|
197
|
+
@echo ""
|
|
198
|
+
@sed -n 's/^## //p' $(MAKEFILE_LIST)
|
|
199
|
+
EOF
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
# Generate C++ project Makefile
|
|
203
|
+
generate_cpp_makefile() {
|
|
204
|
+
local project="$1"
|
|
205
|
+
render_template_with_project "$project" << 'EOF'
|
|
206
|
+
# Makefile for C++ project
|
|
207
|
+
SHELL := bash
|
|
208
|
+
.ONESHELL:
|
|
209
|
+
.SHELLFLAGS := -eu -o pipefail -c
|
|
210
|
+
.DELETE_ON_ERROR:
|
|
211
|
+
.SUFFIXES:
|
|
212
|
+
MAKEFLAGS += --warn-undefined-variables
|
|
213
|
+
MAKEFLAGS += --no-builtin-rules
|
|
214
|
+
|
|
215
|
+
PROJECT := PROJECT_NAME
|
|
216
|
+
VERSION := 1.0.0
|
|
217
|
+
|
|
218
|
+
CXX ?= g++
|
|
219
|
+
CXXFLAGS ?= -Wall -Wextra -std=c++17 -O2
|
|
220
|
+
PREFIX ?= /usr/local
|
|
221
|
+
|
|
222
|
+
SRCDIR := src
|
|
223
|
+
BUILDDIR := build
|
|
224
|
+
OBJDIR := $(BUILDDIR)/obj
|
|
225
|
+
|
|
226
|
+
SOURCES := $(wildcard $(SRCDIR)/*.cpp)
|
|
227
|
+
OBJECTS := $(SOURCES:$(SRCDIR)/%.cpp=$(OBJDIR)/%.o)
|
|
228
|
+
DEPENDS := $(OBJECTS:.o=.d)
|
|
229
|
+
TARGET := $(BUILDDIR)/$(PROJECT)
|
|
230
|
+
|
|
231
|
+
.PHONY: all clean install test help
|
|
232
|
+
|
|
233
|
+
## Build the application (default)
|
|
234
|
+
all: $(TARGET)
|
|
235
|
+
|
|
236
|
+
$(TARGET): $(OBJECTS)
|
|
237
|
+
@mkdir -p $(@D)
|
|
238
|
+
$(CXX) $(LDFLAGS) $^ $(LDLIBS) -o $@
|
|
239
|
+
|
|
240
|
+
$(OBJDIR)/%.o: $(SRCDIR)/%.cpp
|
|
241
|
+
@mkdir -p $(@D)
|
|
242
|
+
$(CXX) $(CPPFLAGS) $(CXXFLAGS) -MMD -MP -c $< -o $@
|
|
243
|
+
|
|
244
|
+
-include $(DEPENDS)
|
|
245
|
+
|
|
246
|
+
## Install to PREFIX
|
|
247
|
+
install: $(TARGET)
|
|
248
|
+
install -d $(DESTDIR)$(PREFIX)/bin
|
|
249
|
+
install -m 755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/$(PROJECT)
|
|
250
|
+
|
|
251
|
+
## Run tests
|
|
252
|
+
test: $(TARGET)
|
|
253
|
+
@echo "Running tests..."
|
|
254
|
+
@$(TARGET) --test
|
|
255
|
+
|
|
256
|
+
## Remove build artifacts
|
|
257
|
+
clean:
|
|
258
|
+
$(RM) -r $(BUILDDIR)
|
|
259
|
+
|
|
260
|
+
## Show help
|
|
261
|
+
help:
|
|
262
|
+
@echo "$(PROJECT) v$(VERSION)"
|
|
263
|
+
@echo ""
|
|
264
|
+
@sed -n 's/^## //p' $(MAKEFILE_LIST)
|
|
265
|
+
EOF
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
# Generate C library Makefile
|
|
269
|
+
generate_c_lib_makefile() {
|
|
270
|
+
local project="$1"
|
|
271
|
+
render_template_with_project "$project" << 'EOF'
|
|
272
|
+
# Makefile for C library project
|
|
273
|
+
.DELETE_ON_ERROR:
|
|
274
|
+
|
|
275
|
+
PROJECT := PROJECT_NAME
|
|
276
|
+
VERSION := 1.0.0
|
|
277
|
+
|
|
278
|
+
CC ?= gcc
|
|
279
|
+
AR ?= ar
|
|
280
|
+
RANLIB ?= ranlib
|
|
281
|
+
CFLAGS ?= -Wall -Wextra -O2 -fPIC
|
|
282
|
+
PREFIX ?= /usr/local
|
|
283
|
+
|
|
284
|
+
SRCDIR := src
|
|
285
|
+
BUILDDIR := build
|
|
286
|
+
OBJDIR := $(BUILDDIR)/obj
|
|
287
|
+
|
|
288
|
+
SOURCES := $(wildcard $(SRCDIR)/*.c)
|
|
289
|
+
OBJECTS := $(SOURCES:$(SRCDIR)/%.c=$(OBJDIR)/%.o)
|
|
290
|
+
HEADERS := $(wildcard $(SRCDIR)/*.h)
|
|
291
|
+
|
|
292
|
+
STATIC_LIB := $(BUILDDIR)/lib$(PROJECT).a
|
|
293
|
+
SHARED_LIB := $(BUILDDIR)/lib$(PROJECT).so.$(VERSION)
|
|
294
|
+
|
|
295
|
+
.PHONY: all static shared clean install help
|
|
296
|
+
|
|
297
|
+
## Build both static and shared libraries
|
|
298
|
+
all: static shared
|
|
299
|
+
|
|
300
|
+
## Build static library
|
|
301
|
+
static: $(STATIC_LIB)
|
|
302
|
+
|
|
303
|
+
## Build shared library
|
|
304
|
+
shared: $(SHARED_LIB)
|
|
305
|
+
|
|
306
|
+
$(STATIC_LIB): $(OBJECTS)
|
|
307
|
+
@mkdir -p $(@D)
|
|
308
|
+
$(AR) rcs $@ $^
|
|
309
|
+
$(RANLIB) $@
|
|
310
|
+
|
|
311
|
+
$(SHARED_LIB): $(OBJECTS)
|
|
312
|
+
@mkdir -p $(@D)
|
|
313
|
+
$(CC) -shared -Wl,-soname,lib$(PROJECT).so.1 $^ -o $@
|
|
314
|
+
|
|
315
|
+
$(OBJDIR)/%.o: $(SRCDIR)/%.c
|
|
316
|
+
@mkdir -p $(@D)
|
|
317
|
+
$(CC) $(CPPFLAGS) $(CFLAGS) -c $< -o $@
|
|
318
|
+
|
|
319
|
+
## Install libraries
|
|
320
|
+
install: all
|
|
321
|
+
install -d $(DESTDIR)$(PREFIX)/lib
|
|
322
|
+
install -m 644 $(STATIC_LIB) $(DESTDIR)$(PREFIX)/lib/
|
|
323
|
+
install -m 755 $(SHARED_LIB) $(DESTDIR)$(PREFIX)/lib/
|
|
324
|
+
install -d $(DESTDIR)$(PREFIX)/include/$(PROJECT)
|
|
325
|
+
install -m 644 $(HEADERS) $(DESTDIR)$(PREFIX)/include/$(PROJECT)/
|
|
326
|
+
|
|
327
|
+
## Clean build artifacts
|
|
328
|
+
clean:
|
|
329
|
+
$(RM) -r $(BUILDDIR)
|
|
330
|
+
|
|
331
|
+
## Show help
|
|
332
|
+
help:
|
|
333
|
+
@sed -n 's/^## //p' $(MAKEFILE_LIST)
|
|
334
|
+
EOF
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
# Generate Go project Makefile
|
|
338
|
+
generate_go_makefile() {
|
|
339
|
+
local project="$1"
|
|
340
|
+
render_template_with_project "$project" << 'EOF'
|
|
341
|
+
# Makefile for Go project
|
|
342
|
+
.PHONY: all build install test clean fmt lint help
|
|
343
|
+
|
|
344
|
+
PROJECT := PROJECT_NAME
|
|
345
|
+
GO ?= go
|
|
346
|
+
PREFIX ?= /usr/local
|
|
347
|
+
GO_MAIN ?= ./cmd/$(PROJECT)
|
|
348
|
+
|
|
349
|
+
VERSION := $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev")
|
|
350
|
+
LDFLAGS := -ldflags "-X main.version=$(VERSION)"
|
|
351
|
+
|
|
352
|
+
SOURCES := $(shell find . -name '*.go' -not -path './vendor/*')
|
|
353
|
+
GO_SUM := $(wildcard go.sum)
|
|
354
|
+
TARGET := $(PROJECT)
|
|
355
|
+
|
|
356
|
+
## Build the application (default)
|
|
357
|
+
all: build
|
|
358
|
+
|
|
359
|
+
## Build binary
|
|
360
|
+
build: $(TARGET)
|
|
361
|
+
|
|
362
|
+
$(TARGET): $(SOURCES) go.mod $(GO_SUM)
|
|
363
|
+
$(GO) build $(LDFLAGS) -o $@ $(GO_MAIN)
|
|
364
|
+
|
|
365
|
+
## Install to PREFIX
|
|
366
|
+
install: $(TARGET)
|
|
367
|
+
install -d $(DESTDIR)$(PREFIX)/bin
|
|
368
|
+
install -m 755 $(TARGET) $(DESTDIR)$(PREFIX)/bin/
|
|
369
|
+
|
|
370
|
+
## Run tests
|
|
371
|
+
test:
|
|
372
|
+
$(GO) test -v ./...
|
|
373
|
+
|
|
374
|
+
## Clean build artifacts
|
|
375
|
+
clean:
|
|
376
|
+
$(RM) $(TARGET)
|
|
377
|
+
$(GO) clean
|
|
378
|
+
|
|
379
|
+
## Format code
|
|
380
|
+
fmt:
|
|
381
|
+
$(GO) fmt ./...
|
|
382
|
+
|
|
383
|
+
## Run linter
|
|
384
|
+
lint:
|
|
385
|
+
golangci-lint run
|
|
386
|
+
|
|
387
|
+
## Show help
|
|
388
|
+
help:
|
|
389
|
+
@echo "$(PROJECT) - Go Project"
|
|
390
|
+
@echo "Version: $(VERSION)"
|
|
391
|
+
@echo ""
|
|
392
|
+
@sed -n 's/^## //p' $(MAKEFILE_LIST)
|
|
393
|
+
EOF
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
# Generate Python project Makefile
|
|
397
|
+
generate_python_makefile() {
|
|
398
|
+
local project="$1"
|
|
399
|
+
render_template_with_project "$project" << 'EOF'
|
|
400
|
+
# Makefile for Python project
|
|
401
|
+
.PHONY: all build install develop test format lint clean help
|
|
402
|
+
|
|
403
|
+
PROJECT := PROJECT_NAME
|
|
404
|
+
PYTHON ?= python3
|
|
405
|
+
PIP ?= $(PYTHON) -m pip
|
|
406
|
+
|
|
407
|
+
## Build the package (default)
|
|
408
|
+
all: build
|
|
409
|
+
|
|
410
|
+
## Build Python package
|
|
411
|
+
build:
|
|
412
|
+
$(PYTHON) -m build
|
|
413
|
+
|
|
414
|
+
## Install package
|
|
415
|
+
install:
|
|
416
|
+
$(PIP) install .
|
|
417
|
+
|
|
418
|
+
## Install in development mode
|
|
419
|
+
develop:
|
|
420
|
+
$(PIP) install -e .[dev]
|
|
421
|
+
|
|
422
|
+
## Run tests
|
|
423
|
+
test:
|
|
424
|
+
$(PYTHON) -m pytest tests/ -v
|
|
425
|
+
|
|
426
|
+
## Format code
|
|
427
|
+
format:
|
|
428
|
+
$(PYTHON) -m black src/ tests/
|
|
429
|
+
$(PYTHON) -m isort src/ tests/
|
|
430
|
+
|
|
431
|
+
## Run linters
|
|
432
|
+
lint:
|
|
433
|
+
$(PYTHON) -m flake8 src/ tests/
|
|
434
|
+
$(PYTHON) -m pylint src/
|
|
435
|
+
|
|
436
|
+
## Clean build artifacts
|
|
437
|
+
clean:
|
|
438
|
+
$(RM) -r build/ dist/ *.egg-info/
|
|
439
|
+
$(RM) -r .pytest_cache/ .coverage htmlcov/
|
|
440
|
+
find . -type d -name '__pycache__' -exec rm -r {} +
|
|
441
|
+
|
|
442
|
+
## Show help
|
|
443
|
+
help:
|
|
444
|
+
@echo "$(PROJECT) - Python Project"
|
|
445
|
+
@echo ""
|
|
446
|
+
@sed -n 's/^## //p' $(MAKEFILE_LIST)
|
|
447
|
+
EOF
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
# Generate Java project Makefile
|
|
451
|
+
generate_java_makefile() {
|
|
452
|
+
local project="$1"
|
|
453
|
+
render_template_with_project "$project" << 'EOF'
|
|
454
|
+
# Makefile for Java project
|
|
455
|
+
.DELETE_ON_ERROR:
|
|
456
|
+
|
|
457
|
+
PROJECT := PROJECT_NAME
|
|
458
|
+
VERSION := 1.0.0
|
|
459
|
+
MAIN_CLASS := Main
|
|
460
|
+
|
|
461
|
+
# Java tools
|
|
462
|
+
JAVAC ?= javac
|
|
463
|
+
JAVA ?= java
|
|
464
|
+
JAR ?= jar
|
|
465
|
+
|
|
466
|
+
# Compiler flags
|
|
467
|
+
JAVAC_FLAGS ?= -Xlint:all -encoding UTF-8
|
|
468
|
+
JAR_FLAGS := cvf
|
|
469
|
+
|
|
470
|
+
# Directories
|
|
471
|
+
SRCDIR := src
|
|
472
|
+
BUILDDIR := build
|
|
473
|
+
CLASSDIR := $(BUILDDIR)/classes
|
|
474
|
+
LIBDIR := lib
|
|
475
|
+
DOCDIR := $(BUILDDIR)/docs
|
|
476
|
+
DISTDIR := dist
|
|
477
|
+
|
|
478
|
+
# Source and class files
|
|
479
|
+
JAVA_SOURCES := $(shell find $(SRCDIR) -name '*.java')
|
|
480
|
+
JAVA_CLASSES := $(JAVA_SOURCES:$(SRCDIR)/%.java=$(CLASSDIR)/%.class)
|
|
481
|
+
|
|
482
|
+
# Classpath
|
|
483
|
+
CLASSPATH := $(CLASSDIR)
|
|
484
|
+
ifneq ($(wildcard $(LIBDIR)/*.jar),)
|
|
485
|
+
CLASSPATH := $(CLASSPATH):$(LIBDIR)/*
|
|
486
|
+
endif
|
|
487
|
+
|
|
488
|
+
# Output JAR
|
|
489
|
+
TARGET := $(DISTDIR)/$(PROJECT)-$(VERSION).jar
|
|
490
|
+
|
|
491
|
+
.PHONY: all build compile jar run run-jar test clean distclean docs help
|
|
492
|
+
|
|
493
|
+
## Build the project (default)
|
|
494
|
+
all: build
|
|
495
|
+
|
|
496
|
+
## Compile and create JAR
|
|
497
|
+
build: jar
|
|
498
|
+
|
|
499
|
+
## Compile Java sources
|
|
500
|
+
compile: $(CLASSDIR)/.compiled
|
|
501
|
+
|
|
502
|
+
$(CLASSDIR)/.compiled: $(JAVA_SOURCES)
|
|
503
|
+
@mkdir -p $(CLASSDIR)
|
|
504
|
+
$(JAVAC) $(JAVAC_FLAGS) -d $(CLASSDIR) -cp "$(CLASSPATH)" $(JAVA_SOURCES)
|
|
505
|
+
@touch $@
|
|
506
|
+
|
|
507
|
+
## Create JAR file
|
|
508
|
+
jar: compile
|
|
509
|
+
@mkdir -p $(DISTDIR)
|
|
510
|
+
@echo "Manifest-Version: 1.0" > $(BUILDDIR)/MANIFEST.MF
|
|
511
|
+
@echo "Main-Class: $(MAIN_CLASS)" >> $(BUILDDIR)/MANIFEST.MF
|
|
512
|
+
@echo "Created-By: Makefile" >> $(BUILDDIR)/MANIFEST.MF
|
|
513
|
+
$(JAR) $(JAR_FLAGS)m $(TARGET) $(BUILDDIR)/MANIFEST.MF -C $(CLASSDIR) .
|
|
514
|
+
@echo "Created: $(TARGET)"
|
|
515
|
+
|
|
516
|
+
## Run the application
|
|
517
|
+
run: compile
|
|
518
|
+
$(JAVA) -cp "$(CLASSPATH)" $(MAIN_CLASS)
|
|
519
|
+
|
|
520
|
+
## Run with JAR
|
|
521
|
+
run-jar: jar
|
|
522
|
+
$(JAVA) -jar $(TARGET)
|
|
523
|
+
|
|
524
|
+
## Run tests (requires JUnit in lib/)
|
|
525
|
+
test: compile
|
|
526
|
+
@echo "Running tests..."
|
|
527
|
+
@if [ -d "$(SRCDIR)/test" ]; then \
|
|
528
|
+
$(JAVA) -cp "$(CLASSPATH):$(LIBDIR)/*" org.junit.runner.JUnitCore; \
|
|
529
|
+
else \
|
|
530
|
+
echo "No test directory found"; \
|
|
531
|
+
fi
|
|
532
|
+
|
|
533
|
+
## Generate Javadoc
|
|
534
|
+
docs:
|
|
535
|
+
@mkdir -p $(DOCDIR)
|
|
536
|
+
javadoc -d $(DOCDIR) -sourcepath $(SRCDIR) -subpackages .
|
|
537
|
+
@echo "Documentation generated: $(DOCDIR)/index.html"
|
|
538
|
+
|
|
539
|
+
## Remove build artifacts
|
|
540
|
+
clean:
|
|
541
|
+
$(RM) -r $(BUILDDIR)
|
|
542
|
+
@echo "Clean complete"
|
|
543
|
+
|
|
544
|
+
## Remove all generated files
|
|
545
|
+
distclean: clean
|
|
546
|
+
$(RM) -r $(DISTDIR)
|
|
547
|
+
@echo "Distclean complete"
|
|
548
|
+
|
|
549
|
+
## Show available targets
|
|
550
|
+
help:
|
|
551
|
+
@echo "$(PROJECT) v$(VERSION) - Java Project"
|
|
552
|
+
@echo ""
|
|
553
|
+
@echo "Targets:"
|
|
554
|
+
@sed -n 's/^## //p' $(MAKEFILE_LIST) | column -t -s ':' | sed 's/^/ /'
|
|
555
|
+
@echo ""
|
|
556
|
+
@echo "Variables:"
|
|
557
|
+
@echo " JAVAC=$(JAVAC)"
|
|
558
|
+
@echo " JAVAC_FLAGS=$(JAVAC_FLAGS)"
|
|
559
|
+
@echo " MAIN_CLASS=$(MAIN_CLASS)"
|
|
560
|
+
@echo ""
|
|
561
|
+
@echo "Directory Structure:"
|
|
562
|
+
@echo " $(SRCDIR)/ - Java source files"
|
|
563
|
+
@echo " $(LIBDIR)/ - External JAR dependencies"
|
|
564
|
+
@echo " $(BUILDDIR)/ - Build output"
|
|
565
|
+
@echo " $(DISTDIR)/ - Distribution JARs"
|
|
566
|
+
@echo ""
|
|
567
|
+
@echo "Examples:"
|
|
568
|
+
@echo " make # Build the project"
|
|
569
|
+
@echo " make run # Compile and run"
|
|
570
|
+
@echo " make jar # Create JAR file"
|
|
571
|
+
@echo " make MAIN_CLASS=MyApp # Set main class"
|
|
572
|
+
EOF
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
# Generate generic Makefile
|
|
576
|
+
generate_generic_makefile() {
|
|
577
|
+
local project="$1"
|
|
578
|
+
render_template_with_project "$project" << 'EOF'
|
|
579
|
+
# Generic Makefile
|
|
580
|
+
.PHONY: all build clean install test help
|
|
581
|
+
|
|
582
|
+
PROJECT := PROJECT_NAME
|
|
583
|
+
VERSION := 1.0.0
|
|
584
|
+
|
|
585
|
+
## Build the project (default)
|
|
586
|
+
all: build
|
|
587
|
+
|
|
588
|
+
## Build target
|
|
589
|
+
build:
|
|
590
|
+
@echo "Building $(PROJECT)..."
|
|
591
|
+
# Add build commands here
|
|
592
|
+
|
|
593
|
+
## Install target
|
|
594
|
+
install: build
|
|
595
|
+
@echo "Installing $(PROJECT)..."
|
|
596
|
+
# Add installation commands here
|
|
597
|
+
|
|
598
|
+
## Run tests
|
|
599
|
+
test:
|
|
600
|
+
@echo "Running tests..."
|
|
601
|
+
# Add test commands here
|
|
602
|
+
|
|
603
|
+
## Clean build artifacts
|
|
604
|
+
clean:
|
|
605
|
+
@echo "Cleaning..."
|
|
606
|
+
# Add cleanup commands here
|
|
607
|
+
|
|
608
|
+
## Show help
|
|
609
|
+
help:
|
|
610
|
+
@echo "$(PROJECT) v$(VERSION)"
|
|
611
|
+
@echo ""
|
|
612
|
+
@echo "Available targets:"
|
|
613
|
+
@sed -n 's/^## //p' $(MAKEFILE_LIST)
|
|
614
|
+
EOF
|
|
615
|
+
}
|
|
616
|
+
|
|
617
|
+
# Main generation logic
|
|
618
|
+
generate_makefile() {
|
|
619
|
+
local type="$1"
|
|
620
|
+
local project="$2"
|
|
621
|
+
local output="$3"
|
|
622
|
+
|
|
623
|
+
# Check if output file exists
|
|
624
|
+
if [[ -f "${output}" ]]; then
|
|
625
|
+
if [[ "${FORCE}" -eq 1 ]]; then
|
|
626
|
+
print_info "Overwriting existing file: ${output}"
|
|
627
|
+
elif [[ -t 0 ]]; then
|
|
628
|
+
# Interactive mode - prompt user
|
|
629
|
+
print_error "File '${output}' already exists"
|
|
630
|
+
read -p "Overwrite? [y/N] " -n 1 -r
|
|
631
|
+
echo
|
|
632
|
+
if [[ ! $REPLY =~ ^[Yy]$ ]]; then
|
|
633
|
+
print_info "Aborted"
|
|
634
|
+
exit 0
|
|
635
|
+
fi
|
|
636
|
+
else
|
|
637
|
+
# Non-interactive mode - fail without --force
|
|
638
|
+
print_error "File '${output}' already exists. Use -f/--force to overwrite."
|
|
639
|
+
exit 1
|
|
640
|
+
fi
|
|
641
|
+
fi
|
|
642
|
+
|
|
643
|
+
print_info "Generating ${type} Makefile for project '${project}'..."
|
|
644
|
+
|
|
645
|
+
case "${type}" in
|
|
646
|
+
c)
|
|
647
|
+
generate_c_makefile "${project}" > "${output}"
|
|
648
|
+
;;
|
|
649
|
+
c-lib)
|
|
650
|
+
generate_c_lib_makefile "${project}" > "${output}"
|
|
651
|
+
;;
|
|
652
|
+
cpp)
|
|
653
|
+
generate_cpp_makefile "${project}" > "${output}"
|
|
654
|
+
;;
|
|
655
|
+
go)
|
|
656
|
+
generate_go_makefile "${project}" > "${output}"
|
|
657
|
+
;;
|
|
658
|
+
python)
|
|
659
|
+
generate_python_makefile "${project}" > "${output}"
|
|
660
|
+
;;
|
|
661
|
+
java)
|
|
662
|
+
generate_java_makefile "${project}" > "${output}"
|
|
663
|
+
;;
|
|
664
|
+
generic)
|
|
665
|
+
generate_generic_makefile "${project}" > "${output}"
|
|
666
|
+
;;
|
|
667
|
+
*)
|
|
668
|
+
print_error "Unknown project type: ${type}"
|
|
669
|
+
echo ""
|
|
670
|
+
usage
|
|
671
|
+
exit 1
|
|
672
|
+
;;
|
|
673
|
+
esac
|
|
674
|
+
|
|
675
|
+
print_success "Makefile generated: ${output}"
|
|
676
|
+
print_info "Edit the Makefile to customize for your project"
|
|
677
|
+
print_info "Run 'make help' to see available targets"
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
# Parse arguments
|
|
681
|
+
parse_args "$@"
|
|
682
|
+
|
|
683
|
+
# Check required argument
|
|
684
|
+
if [[ -z "${PROJECT_TYPE}" ]]; then
|
|
685
|
+
usage
|
|
686
|
+
exit 0
|
|
687
|
+
fi
|
|
688
|
+
|
|
689
|
+
# Main execution
|
|
690
|
+
generate_makefile "${PROJECT_TYPE}" "${PROJECT_NAME}" "${OUTPUT_FILE}"
|