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.
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/PKG-INFO +2 -2
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/README.md +1 -1
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/pyproject.toml +1 -1
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/__init__.py +1 -1
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/cli.py +1 -1
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/init.py +472 -1
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/PKG-INFO +2 -2
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/setup.cfg +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/__init__.py +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/audit.py +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/fix.py +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/commands/ship.py +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/devflow/utils.py +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/SOURCES.txt +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/dependency_links.txt +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/entry_points.txt +0 -0
- {kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/requires.txt +0 -0
- {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.
|
|
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
|
|
144
|
+
pip install kryptorious-devflow
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
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.
|
|
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"}
|
|
@@ -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
|
|
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
|
{kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/PKG-INFO
RENAMED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: kryptorious-devflow
|
|
3
|
-
Version: 1.
|
|
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
|
|
144
|
+
pip install kryptorious-devflow
|
|
145
145
|
```
|
|
146
146
|
|
|
147
147
|
Requires Python 3.9+.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{kryptorious_devflow-1.0.0 → kryptorious_devflow-1.1.0}/src/kryptorious_devflow.egg-info/SOURCES.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|