1313//! - Database adapter (SQLite default, PostgreSQL)
1414//! - Authentication (email+password, passkey, OAuth)
1515
16- use anyhow:: Result ;
16+ use anyhow:: { Context , Result } ;
1717use clap:: Args ;
18+ use std:: fs;
19+ use std:: path:: PathBuf ;
1820
1921#[ derive( Debug , Args ) ]
2022pub struct NewArgs {
@@ -27,7 +29,71 @@ pub struct NewArgs {
2729
2830pub async fn run ( args : NewArgs ) -> Result < ( ) > {
2931 crate :: output:: info ( & format ! ( "Creating new Forge project: {}" , args. name) ) ;
30- // TODO: Implement project scaffolding
32+
33+ let base_path = PathBuf :: from ( & args. name ) ;
34+
35+ // Create directory structure
36+ fs:: create_dir_all ( base_path. join ( "app" ) . join ( "pages" ) )
37+ . with_context ( || format ! ( "Failed to create project directories in {}" , args. name) ) ?;
38+
39+ // Write forge.toml
40+ let forge_toml_content = format ! (
41+ r#"[project]
42+ name = "{}"
43+ version = "0.1.0"
44+
45+ [build]
46+ entry = "app/root.fx"
47+ output = ".forge/dist"
48+ "# ,
49+ args. name
50+ ) ;
51+ fs:: write ( base_path. join ( "forge.toml" ) , forge_toml_content) ?;
52+
53+ // Write app/root.fx
54+ let root_fx_content = r#"export default function Root({ children }) {
55+ return (
56+ <html>
57+ <head>
58+ <title>New Forge App</title>
59+ </head>
60+ <body>
61+ {children}
62+ </body>
63+ </html>
64+ );
65+ }
66+ "# ;
67+ fs:: write ( base_path. join ( "app" ) . join ( "root.fx" ) , root_fx_content) ?;
68+
69+ // Write app/routes.fx
70+ let routes_fx_content = r#"import Home from './pages/Home.fx';
71+
72+ export default [
73+ { path: '/', component: Home },
74+ ];
75+ "# ;
76+ fs:: write ( base_path. join ( "app" ) . join ( "routes.fx" ) , routes_fx_content) ?;
77+
78+ // Write app/pages/Home.fx
79+ let home_fx_content = r#"export default function Home() {
80+ return <h1>Welcome to Forge!</h1>;
81+ }
82+ "# ;
83+ fs:: write (
84+ base_path. join ( "app" ) . join ( "pages" ) . join ( "Home.fx" ) ,
85+ home_fx_content,
86+ ) ?;
87+
88+ // Write schema.fx
89+ fs:: write ( base_path. join ( "schema.fx" ) , "// Empty database schema\n " ) ?;
90+
91+ // Write foundry.lock
92+ fs:: write (
93+ base_path. join ( "foundry.lock" ) ,
94+ "# foundry.lock — generated by forge, do not edit manually\n " ,
95+ ) ?;
96+
3197 crate :: output:: success ( & format ! (
3298 "Created {} — run `cd {} && forge dev` to start" ,
3399 args. name, args. name
0 commit comments