1PORTNAME=	gemini-cli
2DISTVERSION=	0.42.0
3CATEGORIES=	misc # machine-learning
4
5MAINTAINER=	ports@MidnightBSD.org
6COMMENT=	Open-source CLI for direct access to Google's Gemini AI model
7WWW=		https://geminicli.com/ \
8		https://google-gemini.github.io/gemini-cli/ \
9		https://github.com/google-gemini/gemini-cli
10
11LICENSE=	Apache-2.0
12
13BUILD_DEPENDS=	npm:www/npm
14FETCH_DEPENDS=	npm:www/npm
15RUN_DEPENDS=	bash:shells/bash
16
17USES=		nodejs:build,run python:build
18
19PACKAGE_NAME=	@google/gemini-cli
20
21do-fetch:
22	@if ! [ -f ${DISTDIR}/${PORTNAME}-${DISTVERSION}${EXTRACT_SUFX} ]; then ( \
23		${RM} -rf ${WRKDIR}/${PORTNAME}-${DISTVERSION} && \
24		${MKDIR} -p ${WRKDIR}/${PORTNAME}-${DISTVERSION} && \
25		cd ${WRKDIR}/${PORTNAME}-${DISTVERSION} && \
26		if [ -f ${FILESDIR}/package-lock.json ]; then \
27			${ECHO} '{"name":"gemini-cli-installer","version":"1.0.0","dependencies":{"${PACKAGE_NAME}":"^${DISTVERSION}"}}' > package.json && \
28			${CP} ${FILESDIR}/package-lock.json . ; \
29			${SETENV} HOME=${WRKDIR} npm ci --ignore-scripts --global-style --legacy-peer-deps --omit=dev ; \
30		else \
31			${ECHO} '{"name":"gemini-cli-installer","version":"1.0.0"}' > package.json && \
32			npm install --package-lock-only --global-style --legacy-peer-deps ${PACKAGE_NAME}@${DISTVERSION} && \
33			${CP} package-lock.json ${WRKDIR}/package-lock.json.generated && \
34			${ECHO} "" && \
35			${ECHO} "=====================================================================" && \
36			${ECHO} "WARNING: package-lock.json not found in files/ directory" && \
37			${ECHO} "Generated one at: ${WRKDIR}/package-lock.json.generated" && \
38			${ECHO} "" && \
39			${ECHO} "To enable reproducible builds, please:" && \
40			${ECHO} "  1. mkdir -p ${.CURDIR}/files" && \
41			${ECHO} "  2. cp ${WRKDIR}/package-lock.json.generated ${.CURDIR}/files/package-lock.json" && \
42			${ECHO} "  3. Re-run 'make clean distclean && make fetch'" && \
43			${ECHO} "=====================================================================" && \
44			${ECHO} "" && \
45			${SETENV} HOME=${WRKDIR} npm ci --ignore-scripts --global-style --legacy-peer-deps --omit=dev ; \
46		fi && \
47		${MKDIR} -p lib/node_modules/@google && \
48		${MKDIR} -p bin && \
49		${MV} node_modules/${PACKAGE_NAME} lib/node_modules/@google/ && \
50		${LN} -sf ../lib/node_modules/${PACKAGE_NAME}/bundle/gemini.js bin/gemini && \
51		${RM} -rf node_modules package.json && \
52		${FIND} ${WRKDIR} -and -exec ${TOUCH} -h -d 1970-01-01T00:00:00Z {} \; && \
53		cd ${WRKDIR} && ${FIND} ${PORTNAME}-${DISTVERSION} -print0 | LC_ALL=C ${SORT} -z | \
54			${TAR} czf ${DISTDIR}/${PORTNAME}-${DISTVERSION}${EXTRACT_SUFX} --format=bsdtar --gid 0 --uid 0 --options gzip:!timestamp --no-recursion --null -T - \
55	); fi
56
57do-build:
58	# Build native modules for node-pty
59	@cd ${WRKSRC}/lib/node_modules/${PACKAGE_NAME}/node_modules/node-pty && \
60		${SETENV} HOME=${WRKDIR} CFLAGS="-I${LOCALBASE}/include" CXXFLAGS="-I${LOCALBASE}/include" \
61		PYTHON=${PYTHON_CMD} npm rebuild --nodedir=${LOCALBASE}
62
63do-install:
64	# install files
65	@cd ${WRKSRC} && \
66		${COPYTREE_SHARE} . ${PREFIX}
67	# update
68	${REINPLACE_CMD} -i '' \
69		-e "s|#!/usr/bin/env -S node|#!${TRUE_PREFIX}/bin/node|" \
70		${PREFIX}/lib/node_modules/${PACKAGE_NAME}/bundle/gemini.js
71	# set exec bit
72	@${CHMOD} +x ${PREFIX}/lib/node_modules/${PACKAGE_NAME}/bundle/gemini.js
73
74.include <bsd.port.mk>
75