kryptorious-devflow 1.0.0__tar.gz → 1.1.0__tar.gz

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.
Files changed (18) hide show
  1. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/PKG-INFO +2 -2
  2. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/README.md +1 -1
  3. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/pyproject.toml +1 -1
  4. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/__init__.py +1 -1
  5. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/cli.py +1 -1
  6. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/init.py +472 -1
  7. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/PKG-INFO +2 -2
  8. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/setup.cfg +0 -0
  9. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/__init__.py +0 -0
  10. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/audit.py +0 -0
  11. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/fix.py +0 -0
  12. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/ship.py +0 -0
  13. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/utils.py +0 -0
  14. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/SOURCES.txt +0 -0
  15. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/dependency_links.txt +0 -0
  16. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/entry_points.txt +0 -0
  17. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/requires.txt +0 -0
  18. {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kryptorious-devflow
3
- Version: 1.0.0
3
+ Version: 1.1.0
4
4
  Summary: Developer workflow automation CLI — scaffold, audit, fix, and ship projects with one tool.
5
5
  Author: Kryptorious Quantum Biosciences, Inc.
6
6
  License: Proprietary
@@ -141,7 +141,7 @@ $ devflow ship --bump major --dry-run # Preview before shipping
141
141
  ## Installation
142
142
 
143
143
  ```bash
144
- pip install devflow-cli
144
+ pip install kryptorious-devflow
145
145
  ```
146
146
 
147
147
  Requires Python 3.9+.
@@ -108,7 +108,7 @@ $ devflow ship --bump major --dry-run # Preview before shipping
108
108
  ## Installation
109
109
 
110
110
  ```bash
111
- pip install devflow-cli
111
+ pip install kryptorious-devflow
112
112
  ```
113
113
 
114
114
  Requires Python 3.9+.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "kryptorious-devflow"
7
- version = "1.0.0"
7
+ version = "1.1.0"
8
8
  description = "Developer workflow automation CLI — scaffold, audit, fix, and ship projects with one tool."
9
9
  readme = "README.md"
10
10
  license = {text = "Proprietary"}
@@ -3,4 +3,4 @@
3
3
  Scaffold, audit, fix, and ship projects with a single tool.
4
4
  """
5
5
 
6
- __version__ = "1.0.0"
6
+ __version__ = "1.1.0"
@@ -22,7 +22,7 @@ def main():
22
22
  @click.argument("name")
23
23
  @click.option(
24
24
  "--template", "-t",
25
- type=click.Choice(["python", "node", "fullstack", "cli", "api", "lib"]),
25
+ type=click.Choice(["python", "node", "fullstack", "cli", "api", "lib", "go", "rust", "react"]),
26
26
  default="python",
27
27
  help="Project template type"
28
28
  )
@@ -108,8 +108,14 @@ def _build_template(name: str, pkg_name: str, template: str, description: str,
108
108
  return _python_template(name, pkg_name, template, desc, license_type, docker, ci)
109
109
  elif template == "node":
110
110
  return _node_template(name, desc, license_type, docker, ci)
111
+ elif template == "go":
112
+ return _go_template(name, pkg_name, desc, license_type, docker, ci)
113
+ elif template == "rust":
114
+ return _rust_template(name, pkg_name, desc, license_type, docker, ci)
115
+ elif template == "react":
116
+ return _react_template(name, desc, license_type, docker, ci)
111
117
  elif template == "fullstack":
112
- return _fullstack_template(name, pkg_name, desc, license_type, docker, ci)
118
+ return _fullstack_react_template(name, pkg_name, desc, license_type, docker, ci)
113
119
  else:
114
120
  return _python_template(name, pkg_name, "python", desc, license_type, docker, ci)
115
121
 
@@ -614,6 +620,471 @@ SOFTWARE.
614
620
  """
615
621
 
616
622
 
623
+ def _go_template(name: str, pkg_name: str, desc: str,
624
+ license_type: str, docker: bool, ci: bool) -> Dict[str, str]:
625
+ """Go project template."""
626
+ module_path = f"github.com/{pkg_name}/{name}"
627
+
628
+ files = {}
629
+ files["go.mod"] = f"""module {module_path}
630
+
631
+ go 1.22
632
+ """
633
+ files["main.go"] = f"""package main
634
+
635
+ import "fmt"
636
+
637
+ func main() {{
638
+ fmt.Println(hello("world"))
639
+ }}
640
+
641
+ func hello(name string) string {{
642
+ return fmt.Sprintf("Hello from {name}, %s!", name)
643
+ }}
644
+ """
645
+ files["main_test.go"] = f"""package main
646
+
647
+ import "testing"
648
+
649
+ func TestHello(t *testing.T) {{
650
+ got := hello("world")
651
+ want := "Hello from {name}, world!"
652
+ if got != want {{
653
+ t.Errorf("hello() = %q, want %q", got, want)
654
+ }}
655
+ }}
656
+
657
+ func TestHelloCustom(t *testing.T) {{
658
+ got := hello("DevFlow")
659
+ want := "Hello from {name}, DevFlow!"
660
+ if got != want {{
661
+ t.Errorf("hello(\\"DevFlow\\") = %q, want %q", got, want)
662
+ }}
663
+ }}
664
+ """
665
+ files["README.md"] = f"""# {name}
666
+
667
+ {desc}
668
+
669
+ ## Quick Start
670
+
671
+ ```bash
672
+ go run main.go
673
+ go test ./...
674
+ ```
675
+
676
+ Built with [DevFlow](https://devflow.sh).
677
+ """
678
+ files[".gitignore"] = """# Binaries
679
+ *.exe
680
+ *.exe~
681
+ *.dll
682
+ *.so
683
+ *.dylib
684
+ bin/
685
+ dist/
686
+
687
+ # Test binary
688
+ *.test
689
+
690
+ # Go workspace
691
+ go.work
692
+
693
+ # IDE
694
+ .vscode/
695
+ .idea/
696
+
697
+ # OS
698
+ .DS_Store
699
+ Thumbs.db
700
+ .env
701
+ """
702
+
703
+ if ci:
704
+ files[".github/workflows/ci.yml"] = f"""name: CI
705
+
706
+ on:
707
+ push:
708
+ branches: [main, master]
709
+ pull_request:
710
+ branches: [main, master]
711
+
712
+ jobs:
713
+ test:
714
+ runs-on: ubuntu-latest
715
+ steps:
716
+ - uses: actions/checkout@v4
717
+ - uses: actions/setup-go@v5
718
+ with:
719
+ go-version: "1.22"
720
+ - name: Test
721
+ run: go test ./...
722
+ - name: Vet
723
+ run: go vet ./...
724
+ """
725
+
726
+ if docker:
727
+ files["Dockerfile"] = f"""FROM golang:1.22-alpine AS builder
728
+ WORKDIR /app
729
+ COPY go.mod ./
730
+ COPY *.go ./
731
+ RUN go build -o /{name} .
732
+
733
+ FROM alpine:latest
734
+ RUN apk --no-cache add ca-certificates
735
+ COPY --from=builder /{name} /{name}
736
+ CMD ["/{name}"]
737
+ """
738
+
739
+ if license_type == "MIT":
740
+ files["LICENSE"] = _mit_license()
741
+
742
+ return files
743
+
744
+
745
+ def _rust_template(name: str, pkg_name: str, desc: str,
746
+ license_type: str, docker: bool, ci: bool) -> Dict[str, str]:
747
+ """Rust project template."""
748
+ safe_name = pkg_name.replace("_", "-")
749
+
750
+ files = {}
751
+ files["Cargo.toml"] = f"""[package]
752
+ name = "{safe_name}"
753
+ version = "0.1.0"
754
+ edition = "2021"
755
+ description = "{desc}"
756
+ license = "{license_type}"
757
+
758
+ [dependencies]
759
+ """
760
+ files["src/main.rs"] = f"""fn main() {{
761
+ println!("{{}}", hello("world"));
762
+ }}
763
+
764
+ fn hello(name: &str) -> String {{
765
+ format!("Hello from {safe_name}, {{}}!", name)
766
+ }}
767
+
768
+ #[cfg(test)]
769
+ mod tests {{
770
+ use super::*;
771
+
772
+ #[test]
773
+ fn test_hello() {{
774
+ assert_eq!(hello("world"), "Hello from {safe_name}, world!");
775
+ }}
776
+
777
+ #[test]
778
+ fn test_hello_custom() {{
779
+ assert_eq!(hello("DevFlow"), "Hello from {safe_name}, DevFlow!");
780
+ }}
781
+ }}
782
+ """
783
+ files["README.md"] = f"""# {name}
784
+
785
+ {desc}
786
+
787
+ ## Quick Start
788
+
789
+ ```bash
790
+ cargo run
791
+ cargo test
792
+ cargo build --release
793
+ ```
794
+
795
+ Built with [DevFlow](https://devflow.sh).
796
+ """
797
+ files[".gitignore"] = """target/
798
+ Cargo.lock
799
+ **/*.rs.bk
800
+ *.pdb
801
+ .vscode/
802
+ .idea/
803
+ .DS_Store
804
+ """
805
+
806
+ if ci:
807
+ files[".github/workflows/ci.yml"] = f"""name: CI
808
+
809
+ on:
810
+ push:
811
+ branches: [main, master]
812
+ pull_request:
813
+ branches: [main, master]
814
+
815
+ jobs:
816
+ test:
817
+ runs-on: ubuntu-latest
818
+ steps:
819
+ - uses: actions/checkout@v4
820
+ - uses: actions-rust-lang/setup-rust-toolchain@v1
821
+ - name: Test
822
+ run: cargo test
823
+ - name: Clippy
824
+ run: cargo clippy -- -D warnings
825
+ - name: Format check
826
+ run: cargo fmt --check
827
+ """
828
+
829
+ if docker:
830
+ files["Dockerfile"] = f"""FROM rust:1.82-slim AS builder
831
+ WORKDIR /app
832
+ COPY Cargo.toml ./
833
+ COPY src/ src/
834
+ RUN cargo build --release
835
+
836
+ FROM debian:bookworm-slim
837
+ COPY --from=builder /app/target/release/{safe_name} /usr/local/bin/{safe_name}
838
+ CMD ["{safe_name}"]
839
+ """
840
+
841
+ if license_type == "MIT":
842
+ files["LICENSE"] = _mit_license()
843
+
844
+ return files
845
+
846
+
847
+ def _react_template(name: str, desc: str, license_type: str,
848
+ docker: bool, ci: bool) -> Dict[str, str]:
849
+ """React (Vite + TypeScript) project template."""
850
+ files = {}
851
+
852
+ files["package.json"] = f'''{{
853
+ "name": "{name}",
854
+ "private": true,
855
+ "version": "0.1.0",
856
+ "type": "module",
857
+ "scripts": {{
858
+ "dev": "vite",
859
+ "build": "tsc && vite build",
860
+ "preview": "vite preview",
861
+ "lint": "eslint . --ext ts,tsx",
862
+ "test": "vitest run"
863
+ }},
864
+ "dependencies": {{
865
+ "react": "^19.0.0",
866
+ "react-dom": "^19.0.0"
867
+ }},
868
+ "devDependencies": {{
869
+ "@types/react": "^19.0.0",
870
+ "@types/react-dom": "^19.0.0",
871
+ "@vitejs/plugin-react": "^4.3.0",
872
+ "typescript": "^5.6.0",
873
+ "vite": "^6.0.0",
874
+ "vitest": "^3.0.0"
875
+ }}
876
+ }}
877
+ '''
878
+
879
+ files["tsconfig.json"] = """{
880
+ "compilerOptions": {
881
+ "target": "ES2022",
882
+ "lib": ["ES2022", "DOM", "DOM.Iterable"],
883
+ "module": "ESNext",
884
+ "skipLibCheck": true,
885
+ "moduleResolution": "bundler",
886
+ "allowImportingTsExtensions": true,
887
+ "isolatedModules": true,
888
+ "noEmit": true,
889
+ "jsx": "react-jsx",
890
+ "strict": true,
891
+ "noUnusedLocals": true,
892
+ "noUnusedParameters": true,
893
+ "noFallthroughCasesInSwitch": true
894
+ },
895
+ "include": ["src"]
896
+ }
897
+ """
898
+
899
+ files["vite.config.ts"] = """import { defineConfig } from 'vite'
900
+ import react from '@vitejs/plugin-react'
901
+
902
+ export default defineConfig({
903
+ plugins: [react()],
904
+ })
905
+ """
906
+
907
+ files["index.html"] = f"""<!DOCTYPE html>
908
+ <html lang="en">
909
+ <head>
910
+ <meta charset="UTF-8" />
911
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
912
+ <title>{name}</title>
913
+ </head>
914
+ <body>
915
+ <div id="root"></div>
916
+ <script type="module" src="/src/main.tsx"></script>
917
+ </body>
918
+ </html>
919
+ """
920
+
921
+ files["src/main.tsx"] = """import { StrictMode } from 'react'
922
+ import { createRoot } from 'react-dom/client'
923
+ import App from './App'
924
+
925
+ createRoot(document.getElementById('root')!).render(
926
+ <StrictMode>
927
+ <App />
928
+ </StrictMode>,
929
+ )
930
+ """
931
+
932
+ files[f"src/App.tsx"] = f"""import {{ useState }} from 'react'
933
+
934
+ function App() {{
935
+ const [count, setCount] = useState(0)
936
+
937
+ return (
938
+ <div style={{{{ padding: '2rem', fontFamily: 'system-ui' }}}}>
939
+ <h1>{name}</h1>
940
+ <p>{desc}</p>
941
+ <button onClick={{() => setCount(c => c + 1)}}>
942
+ Count: {{count}}
943
+ </button>
944
+ </div>
945
+ )
946
+ }}
947
+
948
+ export default App
949
+ """
950
+
951
+ files["src/App.test.tsx"] = f"""import {{ describe, it, expect }} from 'vitest'
952
+ import {{ render, screen }} from '@testing-library/react'
953
+ import App from './App'
954
+
955
+ describe('App', () => {{
956
+ it('renders project name', () => {{
957
+ render(<App />)
958
+ expect(screen.getByText('{name}')).toBeDefined()
959
+ }})
960
+ }})
961
+ """
962
+
963
+ files["README.md"] = f"""# {name}
964
+
965
+ {desc}
966
+
967
+ ## Quick Start
968
+
969
+ ```bash
970
+ npm install
971
+ npm run dev
972
+ ```
973
+
974
+ Built with [DevFlow](https://devflow.sh).
975
+ """
976
+ files[".gitignore"] = """node_modules/
977
+ dist/
978
+ .env
979
+ *.local
980
+ """
981
+
982
+ if ci:
983
+ files[".github/workflows/ci.yml"] = f"""name: CI
984
+
985
+ on:
986
+ push:
987
+ branches: [main, master]
988
+ pull_request:
989
+ branches: [main, master]
990
+
991
+ jobs:
992
+ test:
993
+ runs-on: ubuntu-latest
994
+ steps:
995
+ - uses: actions/checkout@v4
996
+ - uses: actions/setup-node@v4
997
+ with:
998
+ node-version: 22
999
+ - run: npm ci
1000
+ - run: npm test
1001
+ - run: npm run build
1002
+ """
1003
+
1004
+ if docker:
1005
+ files["Dockerfile"] = f"""FROM node:22-alpine AS builder
1006
+ WORKDIR /app
1007
+ COPY package.json package-lock.json ./
1008
+ RUN npm ci
1009
+ COPY . .
1010
+ RUN npm run build
1011
+
1012
+ FROM nginx:alpine
1013
+ COPY --from=builder /app/dist /usr/share/nginx/html
1014
+ EXPOSE 80
1015
+ CMD ["nginx", "-g", "daemon off;"]
1016
+ """
1017
+
1018
+ if license_type == "MIT":
1019
+ files["LICENSE"] = _mit_license()
1020
+
1021
+ return files
1022
+
1023
+
1024
+ def _fullstack_react_template(name: str, pkg_name: str, desc: str,
1025
+ license_type: str, docker: bool, ci: bool) -> Dict[str, str]:
1026
+ """Full-stack: Python FastAPI backend + React TypeScript frontend."""
1027
+ files = {}
1028
+
1029
+ # Backend
1030
+ be_files = _python_template(f"{name}-backend", f"{pkg_name}_backend", "api", f"{desc} — Backend API", license_type, docker, ci)
1031
+ for k, v in be_files.items():
1032
+ files[f"backend/{k}"] = v
1033
+
1034
+ # Frontend
1035
+ fe_files = _react_template(f"{name}-frontend", f"{desc} — Frontend", license_type, docker, ci)
1036
+ for k, v in fe_files.items():
1037
+ files[f"frontend/{k}"] = v
1038
+
1039
+ # Root
1040
+ files["README.md"] = f"""# {name}
1041
+
1042
+ {desc}
1043
+
1044
+ ## Architecture
1045
+
1046
+ - `backend/` — Python FastAPI REST API
1047
+ - `frontend/` — React TypeScript SPA (Vite)
1048
+
1049
+ ## Quick Start
1050
+
1051
+ ```bash
1052
+ # Backend
1053
+ cd backend
1054
+ pip install -e ".[dev]"
1055
+ uvicorn {pkg_name}_backend.main:app --reload
1056
+
1057
+ # Frontend
1058
+ cd frontend
1059
+ npm install
1060
+ npm run dev
1061
+ ```
1062
+
1063
+ Built with [DevFlow](https://devflow.sh).
1064
+ """
1065
+
1066
+ if docker:
1067
+ files["docker-compose.yml"] = f"""services:
1068
+ backend:
1069
+ build:
1070
+ context: ./backend
1071
+ ports:
1072
+ - "8000:8000"
1073
+ environment:
1074
+ - ENV=development
1075
+
1076
+ frontend:
1077
+ build:
1078
+ context: ./frontend
1079
+ ports:
1080
+ - "3000:80"
1081
+ depends_on:
1082
+ - backend
1083
+ """
1084
+
1085
+ return files
1086
+
1087
+
617
1088
  def _has_uv() -> bool:
618
1089
  """Check if uv is available."""
619
1090
  import subprocess
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: kryptorious-devflow
3
- Version: 1.0.0
3
+ Version: 1.1.0
4
4
  Summary: Developer workflow automation CLI — scaffold, audit, fix, and ship projects with one tool.
5
5
  Author: Kryptorious Quantum Biosciences, Inc.
6
6
  License: Proprietary
@@ -141,7 +141,7 @@ $ devflow ship --bump major --dry-run # Preview before shipping
141
141
  ## Installation
142
142
 
143
143
  ```bash
144
- pip install devflow-cli
144
+ pip install kryptorious-devflow
145
145
  ```
146
146
 
147
147
  Requires Python 3.9+.